簡體   English   中英

Promise.all()數組

[英]array of promises and Promise.all()

我有這樣的承諾數組:

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];

我想全部執行它們,並捕獲這樣的錯誤

Promise.all(promisesArray)
    .then(() => doStuffs())
    .catch((err) => handleError(err));

那很好,但是我現在想在另一個promise的then()中做到這一點:

baseService()
    .then(() => Promise.all([
        service1.load('blabla'),
        service2.load(), // throw an errors
    ]))
    .catch((err) => handleError(err));

只要我直接在Promise.all()中編寫數組,此函數的效果也很好,但是如果我想使用promiseArray定義得更早,例如:

baseService()
    .then(() => Promise.all(promisesArray))
    .catch((err) => handleError(err));

然后, catch()會按預期運行,但控制台中出現錯誤

publish.js:45784 EXCEPTION: Error: Uncaught (in promise): ...

但是我想使用最后一個解決方案,因為我的數組是根據某些條件通過將Promises推入數組而生成的。 (第一個示例工作得很好,我沒有什么不同)

在將每個promise添加到數組中的同時,將捕獲添加到我的每個promise中可以解決我的問題,但是我想找到一個更好的解決方案。

我真的很感謝您的幫助。

PS:如果更改了某些內容,我將在zone2.js中使用angular2

一旦執行了異步函數(一個返回諾言的函數),它就會開始在后台運行(種類)任務,該諾言可能會在您運行后的任何時間解析或拒絕

let promisesArray = [
    service1.load('blabla'),
    service2.load(), // throws an errors
];

這些服務將關閉並加載數據,如果它們在附加.then()之前返回,它們將保持其值,並在您調用promisesArray [0] .then(x => console.log(x))時立即保留。 then函數將使用該值運行

但是,如果這些服務之一引發錯誤並且尚不附加.catch函數,它們將保留該錯誤以便將其發送到以后指定的.catch()函數,但是它們還會引發控制台錯誤-因為他們不知道是否會附加catch函數,如果諾言只是默默地失敗並且錯誤消失了,那將是令人沮喪的。

如果您確實希望您的promisesArray執行AFTER baseService(),那么您的想法就是使promisesArray成為啟動異步任務並返回promise的函數數組。 但是,最好傳遞一個返回一個promise數組的函數,而不是傳遞一個返回一個promise的函數數組(如上所述)。

const getPromises = () => [
    service1.load('blabla'),
    service2.load(), // throws an errors
]

然后執行

baseService()
    .then(() => Promise.all(getPromises()))
    .catch((err) => handleError(err));

這只會在baseServce()完成后啟動您的service1.load,並且所有錯誤一旦發生就會被捕獲。

由於您使用的是angular2,為什么不使用Observable和Http呢

var load1 = http.get('url1'),
    load2 = http.get('url2'),
    load3 = http.get('url3');

Observable.forkJoin(load1, load2, load2, function(res1, res2, res3){
    // manipulate your results here and return the reduced result

    return { whatever : { res1: res1, res2: res2, res3: res3 } }

}).
subscribe(function(finalResult){
     console.log(finalResult); // { whatever : { res1: res1, res2: res2, res3: res3 } }
});

我想出了一種使它起作用的方法。

我創建了一個返回Promise的函數數組,而不是promise數組:

let promisesArray = [
    () => service1.load('blabla'),
    () => service2.load(), // throws an errors
];
promisesArray.push(() => service2.load())

然后,我使用Array.prototype.map()Promise.all()運行promises:

baseService()
    .then(() => Promise.all(promisesArray.map(promise => promise())))
    .catch((err) => handleError(err));

那就是解決我的問題,雖然不確定這是否是最好的方法。 如果有人有更好的主意,我會接受。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM