js Promise 等待多個(gè)異步操作執(zhí)行完再去做一些操作

在我們的程序中有些操作是需要等到一些接口的數(shù)據(jù)返回之后才能做的操作
比如我們在一個(gè)頁面需要發(fā)送好幾個(gè)請求,這幾個(gè)請求都發(fā)送完了我們再去隱藏 loading效果,一開始我是這樣操作的:

 var p1 = new Promise((resolve, reject) => { 
        setTimeout(resolve, 1000, 'one'); 
    }); 
    var p2 = new Promise((resolve, reject) => { 
        setTimeout(resolve, 2000, 'two'); 
    });
    var p3 = new Promise((resolve, reject) => {
        setTimeout(resolve, 3000, 'three');
    });
    var p4 = new Promise((resolve, reject) => {
        setTimeout(resolve, 4000, 'four');
    });
    var p5 = new Promise((resolve, reject) => {
        setTimeout(reject, 4000, 'five');
    });
 function pro() {
        Promise.all([p1, p2, p3, p4,p5]).then(values => { 
            console.log(values);
        }, reason => {
            console.log(reason)
        });
    }
   pro();

執(zhí)行效果:


image.png

只是返回了 失敗回調(diào),這顯然不是我們想要的效果

但是,我們寫好的時(shí)候,使用 Promise.all()方法的時(shí)候,想起來,Promise.all()這個(gè)方法,只要這個(gè)方法的任意一個(gè) promise有reject也就是失敗狀態(tài)的時(shí)候,promise 不管剩余的其他的promise 是否完成,就會停止當(dāng)前的監(jiān)聽,那就有可能丟失當(dāng)前的 其他請求的狀態(tài)和結(jié)果,所以我們在寫的時(shí)候,就應(yīng)該考慮,我們當(dāng)前promise的執(zhí)行權(quán)是不是應(yīng)該交給當(dāng)前單個(gè)promise的回調(diào)具體應(yīng)該怎么操作呢

 var p1 = new Promise((resolve, reject) => { 
        setTimeout(resolve, 1000, 'one'); 
    }); 
    var p2 = new Promise((resolve, reject) => { 
        setTimeout(resolve, 2000, 'two'); 
    });
    var p3 = new Promise((resolve, reject) => {
        setTimeout(reject, 3000, 'three');
    });
    var p4 = new Promise((resolve, reject) => {
        setTimeout(resolve, 4000, 'four');
    });
    var p5 = new Promise((resolve, reject) => {
        setTimeout(resolve, 4000, 'five');
    });
let PromiseArr=[p1,p2,p3,p4,p5];
 function myPromise(promiseList) {
        return promiseList.map(promise =>
            promise.then((res) => ({ status: 'ok', res }), (err) => ({ status: 'not ok', err }))
        )   
    }
    function pro() {
        Promise.all(myPromise(PromiseArr))
        .then(
            res =>{ 
                  console.log(res);
                  if(PromiseArr.length==res.length){
                  //關(guān)閉loading
                  }
            }
            ,err=>console.log(err)
        )
    }
pro()

執(zhí)行效果:


image.png

然后我們判斷,返回結(jié)果的 數(shù)組的長度是否等于傳入數(shù)組的長度,就能知道請求是發(fā)送完成了(不管請求結(jié)果是怎樣);
完?。?/p>

?著作權(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ù)。

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