async 和 await 如何工作,如何正确的使用 async 和 await 。
1.什么是async和await
简单来说,它们是promise嵌套的语法糖
async function helloAsync() { const result = await new Promise((resolve) => setTimeout(() => resolve("Hello")) ); console.log(result); // Hello } helloAsync();
运行上面的代码,函数将输出"Hello",结果显而易见,其中await将阻塞主线程,直到promise处理完成。
2.async
async函数使我们能够编写基于promise的代码,就像它是同步的一样,但不会阻塞执行线程。
通过事件循环异步运行,async函数将始终返回一个值。
使用async简单地将返回一个promise,如果promise没有返回,会自动将它包装在一个promise带有它的指的resolve中。
3.await
await运算符用于等待promise,它只能在async块内使用。关键字await使JavaScript等待直到promise返回结果。
需要注意:await只是让async功能块等待,而不是整个程序执行。不能在常规函数中使用await关键字。
猜猜下面代码片段的输出。
async function helloAsync() { const result = await new Promise((resolve) => setTimeout(() => resolve("Hello")) ); return result; } let asyncResult = helloAsync(); console.log("helloAsync返回值:" + jsON.stringify(asyncResult));
根据上面的代码,可能会认为输出 “Hello” ,对与错要眼见为实,复制上面的代码运行后,输出为:asyncResult值:{},从输出来看,变量 asyncResult 的值为{} 。
3.1.为什么会这样?
因为异步函数总是返回一个promise,而不是解决上面例子中的promise。
3.2.如何解决?
由于async函数在上面的代码片段中返回了一个promise对象,那么就可以使用.then方法来获取async函数的处理结果
async function helloAsync() { const result = await new Promise((resolve) => setTimeout(() => resolve("Hello")) ); return result; } helloAsync().then((data) => { console.log("helloAsync返回值:" + jsON.stringify(data)); });
3.3.更好的方法
使用async和await主要是想避免使用promise链或者.then表达式,所以可以使用async和await本身来解决promise,而不是使用.then
function helloAsync() { return new Promise((resolve) => setTimeout(() => { console.log('hello');
resolve("hello")
}) ); } async function testHelloAsync() { await helloAsync(); console.log('hello2'); } testHelloAsync();