我有一個保存功能,它的行爲是異步的,因此我使用承諾。一個主要的保存事件會進入並且一次只附加一個then
和catch
處理程序。對於我的代碼示例,這將發生在importantSave
方法中。現在,可能會有其他任何其他保存調用稍後調用,並且您可以參考sideSave
方法。是否可以重寫已聲明的Promise鏈?
有沒有一種方法,使在importantSave
方法等待的then
和catch
處理程序所有的側面可以節省解決/拒絕被調用之前,即使他們設立第一?
例如,我有以下代碼:
class Adapter {
promise;
next_attempt;
attempt() {
if (this.promise && this.promise.isPending()) {
this.next_attempt = this.attempt.bind(this);
return this.promise.then(()=> {
if (this.next_attempt) {
return this.next_attempt();
}
});
} else {
this.promise = new Promise(resolve=> {
setTimeout(resolve, 3000);
});
return this.promise;
}
}
}
const adapter = new Adapter();
function importantSave() {
adapter.attempt()
.then(()=> {
console.log('Hello from the important save!');
});
}
function sideSave() {
adapter.attempt()
.then(()=> {
console.log('Hello from the side save!');
});
}
// the important save which sets up its then and catches, but wants to be called after all have finished
importantSave();
// any number of side saves, but will only be called with the last side save
sideSave();
sideSave();
sideSave();
有沒有辦法來改變這種做法,如果importantSave的then
在sideSave調用任何thens
後居然跑?我真實世界的例子會在每次調用之間延遲3次調用save函數,並且只會在3次失敗時纔會拒絕。如果另一個保存呼叫發生在所有3次失敗之前發生,我希望最新呼叫成爲「next_attempt」,覆蓋任何其他嘗試在第一個呼叫仍在等待時保存。如果原始呼叫保存失敗,但其中一個「sideSave」呼叫通過,我希望importantSave
得到滿足,從而落入當時,而不是原來的失敗。
請注意,您將覆蓋'this.next_attempt'時,它已經有一個值,你永遠清除它。還要注意,讓代碼依賴於類似'isPending()'的東西是不好的做法。除了使用諸如'then'之類的東西或派生方法之外,人們永遠不需要檢查承諾的狀態。 – trincot