0
我對承諾的使用有點困惑。 請看下面的例子:我怎麼能捕獲該異常,當我使用promise.all []或停止鏈通話
Q1。我怎樣才能停止連鎖電話?
const wait = (duration = 0) => {
return new Promise((resolve) => {
setTimeout(resolve, duration);
});
};
const asyncTask1 =() => {
return wait(1000).then(() => {
console.log('task1 takes 1s.');
});
};
const asyncTask2 =() => {
return wait(3000).then(() => {
console.log('task2 takes 3s.');
});
};
Promise.resolve()
.then(() => {
asyncTask1();
})
.then(() => {
asyncTask2();
})
.catch(() => {
console.log('fail.');
});
正如代碼所示,asyncTask2
不會運行,直到asyncTask1
已完成。但問題是,如果asyncTask1
失敗,我怎麼能阻止連鎖電話。即asyncTask2
將無法運行,因爲asyncTask1
失敗 。 注:未在asyncTask1產生錯誤或異常,我想用一個狀態(成功或失敗)決定asyncTask1的結果。
Q2。當我使用Promise.all()時,如何知道哪個任務會生成異常?
const wait = (duration=0) => {
return new Promise((resolve) => {
setTimeout(resolve, duration);
});
};
const asyncTask1 =() => {
return wait(1000).then(() => {
console.log('task1 takes 1s.');
});
};
const asyncTask2 =() => {
return wait(3000).then(() => {
console.log('task2 takes 3s.');
});
};
Promise
.all([asyncTask2(), asyncTask1()])
.then(() => {
console.log('all done.');
})
.catch((e) => {
console.log('error');
});
上面的代碼可以正常運行,但是如果asyncTask1
或asyncTask2
失敗,它將進入捕捉功能。所以問題是我怎麼知道這個異常是從asyncTask1
還是asyncTask2
?
只是拋出一個獨特的誤差爲每則可以檢查錯誤以查看它是哪個錯誤。除此之外,使用'Promise.all()'時無法知道。它只報告第一次拒絕,沒有報告它是哪一個。 – jfriend00
它可能感興趣你知道,'新Promise'執行函數有** 2個**參數...'新的承諾((解析,拒絕)=>拒絕(「嗒嗒」))'將拒絕承諾,而不是解決/履行它 –
「*正如代碼所示,asyncTask2將不會運行,直到asyncTask1完成。*」 - 沒有。爲此,您需要將任務承諾從'then'回調中'返回,否則將不會在鏈中等待。 – Bergi