
<p>在学习 async/await 语法之前,您需要很好地了解 JavaScript promises。</p><p>async/await 的工作原理</p><p>async/await 语法是一种特殊语法,用于帮助您处理 promise 对象。它使您的代码更简洁、更清晰。</p><p>处理 时,需要将调用链接到返回 using 方法的函数或变量。PromisePromisethen/catch</p><p>当你有很多承诺时,你还需要很多方法链。例如,以下是使用该函数检索数据的方法:thenfetch()</p><p>fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)</p><p> .then(<span style="color: #569cd6;">response</span> => response.json())</p><p> .then(<span style="color: #569cd6;">json</span> => console.log(json))</p><p> .catch(<span style="color: #569cd6;">error</span> => console.log(error))<span style="color: #6a9955;">;</span></p><p>典型的 Fetch API 实现</p><p>在上面的代码中,该函数返回一个 ,我们使用该方法处理它。在第一种方法中,我们接受 from 请求并使用该方法将其转换为对象。fetch()Promisethen()then()responsejson()</p><p>在第二种方法中,我们从对方法的调用中接收返回的数据,然后将该数据记录到控制台。then()jsonjson()</p><p>我们还添加了该方法来处理运行请求时可能发生的任何错误。catch()</p><p>代码真的不难理解,但是我们可以通过删除 and 链来使其更漂亮,这也删除了回调函数。.then().catch()</p><p>Await 关键字</p><p>该关键字基本上使 JavaScript 等待对象被解析或拒绝。您不必在方法中使用回调模式,而是可以将已实现的承诺分配给如下所示的变量:awaitPromisethen()</p><p>const <span style="color: #569cd6;">response</span> = await fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)<span style="color: #6a9955;">;const json = await response.json();console.log(json)</span></p><p>使用 Await 代替 .then() 方法链接</p><p>关键字放在调用返回 promise 的函数或变量之前。它使 JavaScript 等待 promise 对象安定,然后再运行下一行中的代码。await</p><p>现在,如果运行上面的代码,可能会收到如下错误:</p><p>SyntaxError: await is only valid in async functions and the top level bodies of modules</p><p>在异步函数之外使用 Await 时出现语法错误</p><p>发生此错误的原因是必须在异步函数或模块中使用关键字。await</p><p>Async 关键字</p><p>若要创建异步函数,需要在函数名称前添加关键字。请看下面示例中的第 1 行:async</p><p>async function runProcess() {</p><p> const <span style="color: #569cd6;">response</span> = await fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)<span style="color: #6a9955;">;</span></p><p> const <span style="color: #569cd6;">json</span> = await response.json()<span style="color: #6a9955;">;</span></p><p> console.log(json)}runProcess()<span style="color: #6a9955;">;</span></p><p>创建异步函数</p><p>在这里,我们创建了一个名为的异步函数,并将使用该关键字的代码放入其中。然后,我们可以通过调用它来运行异步函数,就像常规函数一样。runProcess()await</p><p>如何处理 Async/Await 中的错误</p><p>要处理 async/await 语法中可能发生的错误,可以使用 try/catch 块来捕获来自 promise 的任何拒绝。</p><p>请参阅以下示例:</p><p>async function runProcess() {</p><p> try {</p><p> const <span style="color: #569cd6;">response</span> = await fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)<span style="color: #6a9955;">;</span></p><p> const <span style="color: #569cd6;">json</span> = await response.json()<span style="color: #6a9955;">;</span></p><p> console.log(json)<span style="color: #6a9955;">;</span></p><p> } catch (error) {</p><p> console.log(error)<span style="color: #6a9955;">;</span></p><p> }}runProcess()<span style="color: #6a9955;">;</span></p><p>在异步函数中添加 try/catch</p><p>放在函数内部的 try/catch 块将处理来自 promise 对象的拒绝。runProcess()</p><p>现在,我们有了之前创建的标准 Promise 代码的完整 async/await 版本。以下是两者之间的比较:</p><p>PROMISE---异步Promise 与 Async/Await 代码比较</p><p>在 async/await 版本中,promise 的结果直接分配给变量。在标准 promise 版本中,promise 的结果作为参数传递给方法。.then()</p><p>大多数开发人员更喜欢 async/await 版本,因为它看起来更简单。</p><p>如何在 IIFE 和箭头函数中使用 Async/Await</p><p>立即调用函数表达式 (IIFE) 是一种用于在定义函数后立即执行函数的技术。</p><p>与常规函数和变量不同,IIFE 在执行后将从正在运行的进程中删除。</p><p>除了标准函数之外,您还可以制作异步 IIFE。当您只需要运行一次异步函数时,这很有用:</p><p>(async function () {</p><p> try {</p><p> const <span style="color: #569cd6;">response</span> = await fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)<span style="color: #6a9955;">;</span></p><p> const <span style="color: #569cd6;">json</span> = await response.json()<span style="color: #6a9955;">;</span></p><p> console.log(json)<span style="color: #6a9955;">;</span></p><p> } catch (error) {</p><p> console.log(error)<span style="color: #6a9955;">;</span></p><p> }})()<span style="color: #6a9955;">;</span></p><p>IIFE 异步函数示例</p><p>您还可以在创建异步函数时使用箭头语法,如下所示:</p><p>const <span style="color: #569cd6;">runProcess</span> = async () => {</p><p> try {</p><p> const <span style="color: #569cd6;">response</span> = await fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)<span style="color: #6a9955;">;</span></p><p> const <span style="color: #569cd6;">json</span> = await response.json()<span style="color: #6a9955;">;</span></p><p> console.log(json)<span style="color: #6a9955;">;</span></p><p> } catch (error) {</p><p> console.log(error)<span style="color: #6a9955;">;</span></p><p> }}<span style="color: #6a9955;">;runProcess();</span></p><p>Arrow 异步函数示例</p><p>您可以在代码中随意使用所需的语法。</p><p>为什么使用 async/await 语法?</p><p>async/await 语法使您能够在不使用 and 方法链接的情况下处理 promise,这也消除了对嵌套回调的需求。.then().catch()</p><p>当您在确定承诺后有一个复杂的流程时,这种好处是显着的。</p><p>回到上面的示例,假设方法中有一个条件语句,如下所示:.then()</p><p>fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)</p><p> .then(<span style="color: #569cd6;">response</span> => response.json())</p><p> .then(<span style="color: #569cd6;">json</span> => {</p><p> if (<span style="color: #569cd6;">json.userId</span> == 1) {</p><p> <span style="color: #569cd6;">json.completed</span> == false<span style="color: #6a9955;">;</span></p><p> } else {</p><p> <span style="color: #569cd6;">json.completed</span> == true<span style="color: #6a9955;">;</span></p><p> }</p><p> })</p><p> .catch(<span style="color: #569cd6;">error</span> => console.log(error))<span style="color: #6a9955;">;</span></p><p>Promise 方法中的 if/else 块then()</p><p>在这里,您可以看到接受数据的回调函数内部有一个 if/else 块。json</p><p>与 async/await 版本相比,此代码很难推理和修改,如下所示:</p><p>(async function () {</p><p> try {</p><p> const <span style="color: #569cd6;">response</span> = await fetch(<span style="color: #ce9178;">'https://jsonplaceholder.typicode.com/todos/1'</span>)<span style="color: #6a9955;">;</span></p><p> const <span style="color: #569cd6;">json</span> = await response.json()<span style="color: #6a9955;">;</span></p><p> if (<span style="color: #569cd6;">json.userId</span> == 1) {</p><p> <span style="color: #569cd6;">json.completed</span> == false<span style="color: #6a9955;">;</span></p><p> } else {</p><p> <span style="color: #569cd6;">json.completed</span> == true<span style="color: #6a9955;">;</span></p><p> }</p><p> console.log(json)<span style="color: #6a9955;">;</span></p><p> } catch (error) {</p><p> console.log(error)<span style="color: #6a9955;">;</span></p><p> }})()<span style="color: #6a9955;">;</span></p><p>通过使用 async/await 语法,可以减少对方法链接和嵌套回调的需求。这会影响代码的可读性,尤其是当您有嵌套代码(如 if/else 和 for 循环块)时。</p><p>结论</p><p>现在,您已经了解了 async/await 语法的工作原理。该语法通过消除对 和 方法链接的需求,使使用 promise 变得更加容易,这也消除了对嵌套回调的需求。.then().catch()</p><p>即使关键字只能在函数内部使用,也可以使用 IIFE 仅调用异步函数一次。awaitasync</p><p><br/></p><p style="box-sizing: inherit; margin-top: 0px; margin-bottom: 1.5em; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-variant-alternates: inherit; font-variant-position: inherit; font-stretch: inherit; line-height: inherit; font-family: Lato, sans-serif; font-optical-sizing: inherit; font-kerning: inherit; font-feature-settings: inherit; font-variation-settings: inherit; font-size: 22px; vertical-align: baseline; min-width: 100%; color: rgb(10, 10, 35); text-wrap: wrap; background-color: rgb(255, 255, 255);"><br/></p>