[英]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.