generator 算是中間的一個過渡版,但是也有其獨有的東西。
轉載自:https://www.jianshu.com/p/c94edc0057fe
generator可以簡化異步的編碼,減少嵌套,而async、await組合起來使用,可以更進一步
next方法的作用是分階段執行Generator函數。每次調用next方法,會返回一個對象,表示當前階段的信息(value屬性和done屬性)。value屬性是yield語句后面表達式的值,表示當前階段的值;done屬性是一個布爾值,表示Generator函數是否執行完畢,即是否還有下一個階段。

async
函數的返回值是Promise對象,這比Generator函數的返回值是Iterator對象方便多了。
reject之后下邊的代碼不執行了該如何處理。
不過處理方法為第一種try catch 比較好,如果是多個await 直接能一起處理,如果是第二種代碼冗余顯得有些累贅。
多個await
命令后面的異步操作,如果不存在繼發關系,最好讓它們同時觸發。
let foo = await getFoo(); let bar = await getBar();
上面代碼中,getFoo
和getBar
是兩個獨立的異步操作(即互不依賴),被寫成繼發關系。這樣比較耗時,因為只有getFoo
完成以后,才會執行getBar
,完全可以讓它們同時觸發。
修改如下: (推薦第一種)
// 寫法一 let [foo, bar] = await Promise.all([getFoo(), getBar()]); // 寫法二 let fooPromise = getFoo(); let barPromise = getBar(); let foo = await fooPromise; let bar = await barPromise;
並發請求多個接口,按順序輸出
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
,因此實現了按順序輸出。