es6 generator函數和async await的關系


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();
上面代碼中,getFoogetBar是兩個獨立的異步操作(即互不依賴),被寫成繼發關系。這樣比較耗時,因為只有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,因此實現了按順序輸出。

 




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM