js-ES6學習筆記-async函數(3)

來源:互聯網
上載者:User

標籤:迴圈   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)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.