私は非同期に動作する保存関数を持っているので、私は約束を使用しています。メインの保存イベントが入り、特定のthen
とcatch
ハンドラが1度だけ接続されます。私のコード例では、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
後に実行された場合にようにこれを変更する方法はありますか?私の実際の世界の例では、各呼び出しの間に遅延を伴うsave関数を3回呼び出し、3つがすべて失敗した場合にのみ拒否します。 3つすべてが失敗する前にsaveの別の呼び出しが発生した場合、私は最新の呼び出しを "next_attempt"にして、最初の呼び出しがまだ保留中であったときに他の呼び出しを上書きしようとします。元のコールが保存に失敗したが、「sideSave」コールの1つが成功した場合は、importantSave
を実行して元のコールが失敗したキャッチではなく、その時点まで落ちるようにします。
注意を、それあなたが明らかに決して:
今、あなたは行うことができます。また、コードが 'isPending()'のようなものに依存するようにすることは悪い習慣であることに注意してください。 'then'や派生したメソッドを使う以外に、約束の状態をチェックする必要はありません。 – trincot