ES8 引入了 async/await,这是 JavaScript 中处理异步操作的一种新方法。相比于回调函数和 Promise,async/await 的语法更加简洁易懂,也更容易处理复杂的异步场景。但要注意的是,使用 async/await 时也有一些需要注意的事项。在本文中,我们将介绍 ES8 中关于 async/await 的三个注意点,并提供相应的示例代码。
1. async 函数总是返回一个 Promise 对象
在使用 async/await 时,需要注意 async 函数总是返回一个 Promise 对象。如果在 async 函数中直接返回一个值,该值也会被包装成一个 Promise 对象。例如:
async function getData(){ return 'hello world'; } console.log(getData()); // Promise {<resolved>: "hello world"}
在使用 async 函数时,需要记住它返回的一定是一个 Promise 对象,需要使用 Promise 的 then 或者 catch 方法来处理它的结果。
2. await 只能在 async 函数中使用
await 用于异步等待一个 Promise 对象的结果。但是,它只能在 async 函数内使用,不能在全局作用域或者其他函数中使用。例如:
-- -------------------- ---- ------- -------- ------- -- ------ ----- -- ---- ----- -- ----- -------- ----- ---------- - ----- -------- ---------- ------ ------ ------- - -------
这个错误提示表明,在 test 函数中使用了 await,但是 test 函数本身并不是一个 async 函数。因此,如果要使用 await,必须在 async 函数内部使用。
3. 多个 Promise 并行执行时,await 无法保证执行顺序
async/await 是依赖 Promise 的,并行的 Promise 通过 await 来等待结果。但是,在等待多个 Promise 并行执行时,await 并不保证这些 Promise 的执行顺序。例如:
async function getData(){ const data1 = await fetch('/api/data1'); const data2 = await fetch('/api/data2'); console.log(data1, data2); } getData();
在这个例子中,我们分别使用 await 等待两个 Promise 对象的结果,并保存在 data1 和 data2 中。然而,这样的写法让这两个 Promise 对象变成了串行执行,也就是说,先请求数据 1,再请求数据 2,导致了较慢的响应速度。正确的方式是使用 Promise.all 方法来并行执行多个 Promise,例如:
async function getData(){ const [data1, data2] = await Promise.all([fetch('/api/data1'), fetch('/api/data2')]); console.log(data1, data2); } getData();
在这个例子中,我们使用了 Promise.all 方法来并行执行多个 Promise,并将它们的结果存储在一个数组中。这样可以保证两个 Promise 对象被同时执行,缩短响应时间。
结论
async/await 是 JavaScript 中处理异步操作的一种新方法,但在使用它时需要注意这三个问题:async 函数总是返回一个 Promise 对象,await 只能在 async 函数中使用,多个 Promise 并行执行时,await 无法保证执行顺序。这些注意点一旦掌握,将帮助我们更好地使用 async/await 处理异步操作,提高代码的可读性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671382b2ad1e889fe20d7fae