ES8 引入了 async 和 await,这是一种使用 Promise 来优化异步函数编程的方式。async 关键字用于声明一个函数是异步的,而 await 关键字用于等待 Promise 返回结果。这种方式不仅简化了异步编程的复杂性,还可以在代码中使用更加自然的方式来编写异步函数代码。
async 函数
async 函数是一种返回 Promise 对象的异步函数。在函数前面添加 async 关键字声明即可创建一个 async 函数。
async function getData() { //异步操作 return result; }
async 函数内部可以使用 await 等待 Promise 的返回结果,同时 async 函数内部也可以有多个 awiat 表达式。
async function getData() { const result1 = await Promise.resolve('Hello'); const result2 = await Promise.resolve('World'); return `${result1} ${result2}`; }
await 表达式
await 表达式只能在 async 函数体内使用。它会等待一个 Promise 实例返回结果,然后将异步操作的结果返回给调用者。
async function getData() { const result = await Promise.resolve('Hello World'); return result; }
使用 try-catch 可以捕获异步操作的异常。
async function getData() { try { const result = await Promise.reject(new Error('Failed')); return result; } catch (error) { console.log(error.message); } }
还需要注意的是,await 表达式会阻塞 async 函数的执行,直到 Promise 对象返回结果。如果 await 表达式后面是一个耗时较长的操作,那么它就可能会阻塞整个应用程序的执行。
错误处理
async 函数的抛出异常会返回一个 rejected 的 Promise 对象。在编写 async 函数时,需要注意错误处理。
-- -------------------- ---- ------- ----- -------- --------- - --- - ----- ------ - ----- ------------------ ----------------- ------ ------- - ----- ------- - --------------------------- ----- ------ - -
在上面的例子中,如果没有这个 try-catch 语句,rejected 状态的 Promise 对象就会被返回。因此,在 async 函数中使用 try-catch 可以更好地处理异步操作的异常。
示例代码
接下来看一个完整的使用 async 和 awit 的示例。
-- -------------------- ---- ------- ----- -------- ----------------------- - --- - ----- -------- - ----- -------------------------------------------------- -- -------------- - ----- --- --------------------------- - ----- ---- - ----- ---------------- ------ ----- - ----- ------- - --------------------------- ----- ------ - -
这个示例中,我们使用了 fetch 来获取用户的信息,如果响应状态不是 200,那么就抛出一个错误。最后使用 await 表达式将异步操作的结果返回给调用者。
总结
async 和 awiat 是 ES8 中重要的新特性,它们可极大地简化异步函数的编程复杂性。通过使用 async 和 await,我们可以更自然的编写异步函数的代码。同时,代码的可读性和可维护性也得到了大幅度提升。需要注意的是,在编写异步函数时需要注意异常处理。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64edde0ff6b2d6eab380187f