標籤:迴圈 cte log gen ... 關係 each 使用 try
1、await命令後面的Promise對象,運行結果可能是rejected,所以最好把await命令放在try...catch代碼塊中。
2、多個await命令後面的非同步作業,如果不存在繼發關係,最好讓它們同時觸發。
// 寫法一let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 寫法二let fooPromise = getFoo();let barPromise = getBar();let foo = await fooPromise;let bar = await barPromise;
3、await命令只能用在async函數之中,如果用在普通函數,就會報錯。
function dbFuc(db) { //這裡不需要 async let docs = [{}, {}, {}]; // 可能得到錯誤結果 docs.forEach(async function (doc) { await db.post(doc); });}
上面代碼可能不會正常工作,原因是這時三個db.post操作將是並發執行,也就是同時執行,而不是繼發執行。正確的寫法是採用for迴圈。
async function dbFuc(db) { let docs = [{}, {}, {}]; for (let doc of docs) { await db.post(doc); }}
如果確實希望多個請求並發執行,可以使用Promise.all方法。
4、async 函數的實現原理,就是將 Generator 函數和自動執行器,封裝在一個函數裡。
5、
async function logInOrder(urls) { // 並發讀取遠程URL const textPromises = urls.map(async url => { const response = await fetch(url); return response.text(); }); // 按次序輸出 for (const textPromise of textPromises) { console.log(await textPromise); }}
上面代碼中,雖然map方法的參數是async函數,但它是並發執行的,因為只有async函數內部是繼發執行,外部不受影響。後面的for..of迴圈內部使用了await,因此實現了按順序輸出。
js-ES6學習筆記-async函數(3)