Promise.all使用場景

問題描述:

頁面掛掉了,因為接口異常導致,打開瀏覽器調(diào)試了一下,發(fā)現(xiàn)只是一個無關緊要的接口掛掉了。那么一個接口掛掉了為什么會導致整個頁面無數(shù)據(jù)呢?了解Promise.all都知道,如果參數(shù)中 promise 有一個失敗(rejected),此實例回調(diào)失敗(reject),就不再執(zhí)行then方法回調(diào)

Promise.all詳情資料可查看:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/all

Promise.all([p1, p2, p3])
  .then(res => {
    this.data1 = res[0]
    this.data2 = res[1] // 這個數(shù)據(jù)拿不到,接口掛掉了
    this.data3 = res[2]
  })
  .catch((err) => {console.error(err)})

如果參數(shù)中 promise 有一個(p2)失?。╮ejected),此實例回調(diào)失?。╮eject),就不再執(zhí)行then方法回調(diào),被catch掉了,打印了reject結果。

image.png

當然,也可以不使用Promise.all,但如果多個接口之間需要同步進行,后一個接口依賴前一個接口的返回值,這種情況做同步處理就麻煩一點了。

但是,使用Promise.all,如果有一個回調(diào)執(zhí)行失敗,即使其他幾個promise已經(jīng)進入resolved狀態(tài),then也不會執(zhí)行的,或者可以說所有的promise都失敗了(都不能正常取到響應結果)

正如我遇到的問題:也許可能只是一個不關鍵的數(shù)據(jù)加載失敗,其他所有的數(shù)據(jù)也不會顯示,使得項目的容錯大大降低。

分析到這里,我相信大家什么時候使用Promise.all都有一些判斷了,我個人認為有以下情況:幾個異步操作是強相關的,后續(xù)步驟必須依賴這幾個步驟全部成功才能進行。

下面是我的解決辦法:

var p1 =new Promise(function(resolve,reject){
    setTimeout(function(){
        resolve(1);
    },2000)
});
var p2 = new Promise(function(resolve,reject){
          API.fetchData().then((res) => {
            resolve(res);
          }, () => {
            resolve(null); // 防止不關鍵的數(shù)據(jù)加載失敗,影響頁面顯示
          })
    });
var p3 = new Promise(function(resolve,reject){
        setTimeout(function(){
            resolve(3);
        },2000)
    });
Promise.all([p1, p2, p3]).then(function (results) {
    console.log("success");
    console.log(results);
}).catch(function(r){
    console.log("err");
    console.log(r);
});

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

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

  • Promise 對象 Promise 的含義 Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,834評論 1 56
  • 一、Promise的含義 Promise在JavaScript語言中早有實現(xiàn),ES6將其寫進了語言標準,統(tǒng)一了用法...
    Alex灌湯貓閱讀 887評論 0 2
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,563評論 0 8
  • 含義 Promise是異步編程的一種解決方案,用于一個異步操作的最終完成(或失敗)及其結果值的表示,比傳統(tǒng)的回調(diào)函...
    nimw閱讀 27,378評論 0 4
  • 前言 本文旨在簡單講解一下javascript中的Promise對象的概念,特性與簡單的使用方法。并在文末會附上一...
    _暮雨清秋_閱讀 2,315評論 0 3

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