promise 與 async 實(shí)現(xiàn)順序異步任務(wù)對比

function queue_promise(arr) {
    let sequence = Promise.resolve();
    let res = [];
    arr.forEach(a => { //a為function,返回值為promise
        sequence = sequence.then(a).then(data => {
            res.push(data);
            return res;
        })
    })
    return sequence;
}

async function queue_async(arr) {
    let res = [];
    for(let a of arr) {
        let data = await a();  //不能寫成a
        res.push(data);
    }
    return res;
}

//異步任務(wù)1
function getA() {
      return  new Promise(function(resolve, reject){ 
      setTimeout(function(){     
            resolve(2);
        }, 1000);
    });
}
 
//異步任務(wù)2
function getB() {
    return  new Promise(function(resolve, reject){       
        setTimeout(function(){
            resolve(3);
        }, 1000);
    });
}

function addAB(a,b) {
    return a+b
}

queue_promise([getA,getB])
  .then(data => {
    return addAB(data[0],data[1])
  }).then(data=>console.log(data))

queue_async([getA,getB])
  .then(data => {
    return addAB(data[0],data[1])
  }).then(data=>console.log(data))

兩者思路相同,都是創(chuàng)建隊(duì)列去處理異步任務(wù)
promise解決方法中,使用一個(gè)sequence初始觸發(fā)的pomise,狀態(tài)直接是resolve, 這個(gè)sequence不斷承接(更新為)每個(gè)異步任務(wù)完成后的promise,并最終返回,返回的sequence中可以拿到所有異步任務(wù)的輸出值res,另外,此處其實(shí)沒有必要一定初始化 let sequence = Promise.resolve(), sequence只要承接(更新為)每個(gè)異步任務(wù)完成后的promiese即可,promise解決方法可以改寫如下

function queue_promise(arr) {
    let sequence = null;
    let res = [];
    arr.forEach(a => { //a為function,返回值為promise
        sequence = a().then(data => { //直接a() 即直接調(diào)用函數(shù)返回promise
            res.push(data);
            return res;
        })
    })
    return sequence;
}

async解決方法與promise相同,有兩點(diǎn)需要注意,第一個(gè),await關(guān)鍵字不能在普通函數(shù)中使用,所以遍歷異步任務(wù)時(shí)不能使用forEach或map這樣的方法,只能使用for循環(huán)指令。第二個(gè),上面定義每個(gè)異步任務(wù)為返回值為promise的普通函數(shù),在promise方式中處理為 then(a) , 但在async方式中要寫成 await a() 因?yàn)閠hen接收的參數(shù)為函數(shù),而await后面要跟一個(gè)需要等待的值,如果直接放函數(shù)則不會得到正確結(jié)果,這里需要直接放調(diào)用函數(shù)后返回的promise

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 含義 async函數(shù)是Generator函數(shù)的語法糖,它使得異步操作變得更加方便。 寫成async函數(shù),就是下面這...
    oWSQo閱讀 2,043評論 0 2
  • async 函數(shù) 含義 ES2017 標(biāo)準(zhǔn)引入了 async 函數(shù),使得異步操作變得更加方便。 async 函數(shù)是...
    huilegezai閱讀 1,320評論 0 6
  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,836評論 1 56
  • 弄懂js異步 講異步之前,我們必須掌握一個(gè)基礎(chǔ)知識-event-loop。 我們知道JavaScript的一大特點(diǎn)...
    DCbryant閱讀 2,886評論 0 5
  • 【R】原文片段 所謂復(fù)盤,就是在頭腦中對過去所做的事情重新“過”一遍。它通過對過去的思維和行為進(jìn)行回顧、反思和探究...
    382d72b0ca1c閱讀 388評論 0 0

友情鏈接更多精彩內(nèi)容