參考:ECMAScript 6 入門
使用場景:可以將異步方法以同步的方式執(zhí)行
async 函數是什么?一句話跨蟹,它就是 Generator 函數的語法糖橘沥。async函數就是將 Generator 函數的星號(*)替換成async,將yield替換成await痢艺,并在調用 async 函數時按順序執(zhí)行異步方法介陶。可以說 async 函數就是 Generator 函數和自動執(zhí)行器(概念請參照上一篇)的結合哺呜。
async函數的返回值是 Promise 對象某残,這比 Generator 函數的返回值是 Iterator 對象方便多了。你可以用then方法指定下一步的操作玻墅。
多個await命令后面的異步操作,如果不存在繼發(fā)關系环础,最好讓它們同時觸發(fā)剩拢。
錯誤的寫法:
let foo = await getFoo();
let bar = await getBar();
正確的寫法:
// 寫法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);
// 寫法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
- 如何正確的使用 async 和 await?
分析以下代碼,看能否按順序執(zhí)行框都,為什么呵晨?
function dbFuc(db) {
let docs = [{}, {}, {}];
docs.forEach(async function (doc) {
await db.post(doc);
});
}
正確的寫法應該是什么熬尺?請見文章最后。
- 新的提案:(了解就行)
根據語法規(guī)格季二,目前await命令只能出現在 async 函數內部,否則都會報錯胯舷。
目前,有一個語法提案炊汹,允許在模塊的頂層獨立使用await
命令逃顶。這個提案的目的,是借用await
解決模塊異步加載的問題(模塊間按順序互相依賴)霸褒。
// x.js
console.log("X1");
await new Promise(r => setTimeout(r, 1000));
console.log("X2");
// y.js
console.log("Y");
// z.js
import "./x.js";
import "./y.js";
console.log("Z");
打印結果是X1盈蛮、Y、X2眉反、Z
頂層的await命令有點像寸五,交出代碼的執(zhí)行權給其他的模塊加載,等異步操作完成后梳杏,再拿回執(zhí)行權,繼續(xù)向下執(zhí)行叛溢。
思考題答案:
async function dbFuc(db) {
let docs = [{}, {}, {}];
for (let doc of docs) {
await db.post(doc);
}
}