await | 您所在的位置:网站首页 › mdn文档js › await |
当函数执行到 await 时,被等待的表达式会立即执行,所有依赖该表达式的值的代码会被暂停,并推送进微任务队列(microtask queue)。然后主线程被释放出来,用于事件循环中的下一个任务。即使等待的值是已经敲定的 promise 或不是 promise,也会发生这种情况。例如,考虑以下代码: js async function foo(name) { console.log(name, "start"); console.log(name, "middle"); console.log(name, "end"); } foo("First"); foo("Second"); // First start // First middle // First end // Second start // Second middle // Second end对应到 Promise 的写法是: js function foo(name) { return new Promise((resolve) => { console.log(name, "start"); console.log(name, "middle"); console.log(name, "end"); resolve(); }); }执行到 await 时,后面的代码就会整体被安排进一个新的微任务,此后的函数体变为异步执行。 js async function foo(name) { console.log(name, "start"); await console.log(name, "middle"); console.log(name, "end"); } foo("First"); foo("Second"); // First start // First middle // Second start // Second middle // First end // Second end对应的 Promise 写法是: js function foo(name) { return new Promise((resolve) => { console.log(name, "start"); resolve(console.log(name, "middle")); }).then(() => { console.log(name, "end"); }); }虽然这里的 then() 看起来很多余,其中的代码完全可以被合并到构造器的回调里,但不管该 Promise 的状态如何,then() 的回调总会被异步执行,await 的行为也一样。因此,只要情况不是必须或可能需要等待 Promise 的结果,就应该避免使用 await。 其他微任务能在函数执行恢复之前执行: js let i = 0; queueMicrotask(function test() { i++; console.log("microtask", i); if (i { console.log("async function start"); for (let i = 1; i { console.log("queueMicrotask() after calling async function"); }); console.log("script sync part end"); // Logs: // async function start // script sync part end // microtask 1 // async function resume 1 // queueMicrotask() after calling async function // microtask 2 // async function resume 2 // microtask 3 // async function end此案例中,test() 总会在异步函数恢复执行前被调用,呈现轮流的调度。微任务被执行的顺序通常就是入队的先后顺序,而 console.log("queueMicrotask() after calling async function"); 比 await 晚入队,因此 "queueMicrotask() after calling async function" 在异步函数第一次恢复之后才输出。 |
CopyRight 2018-2019 实验室设备网 版权所有 |