我有一個異步函數,調用了其他異步函數,當它們全部完成時,我返回結果。如何在異步函數中有很多回調時正確返回值
我不想使用Promise.all
,因爲如果這些功能失敗,我只是不會將它們添加到我的結果中。
ATM我的代碼看起來像這樣。它的工作原理,但我不喜歡new Promise
,我想在ES6異步的方式做到這一點,所以callAll功能應該像const callAll = async (query) => {
const callAll = (query) => {
return new Promise((resolve, reject) => {
const results = [];
const jobs = [
{
promise: someModuleFirst.search(query),
done: false
},
{
promise: someModuleSecond.search(query),
done: false
},
{
promise: someModuleThird.search(query),
done: false
}
];
const areAllDone =() => {
if(!jobs.filter((job) => !job.done).length) {
return true;
}
};
jobs.forEach((job) => {
job.promise.then((result) => {
job.done = true;
results.push(result);
if(areAllDone()) {
resolve(results);
}
}).catch((error) => {
job.done = true;
if(areAllDone()) {
resolve(results);
}
});
});
});
};
你檢查過'async'模塊嗎?它會爲您節省大量的頭部劃傷 – borislemke
@borislemke async.parallel似乎並不接受承諾在第一次參數,我不想做任何奇怪的黑客,並將承諾轉換爲回調,我試圖使代碼儘可能好 – xerq