さまざまな場所で呼び出される高価な約束がいくつかあります。理想的には、既存の進行中の promise を (オプションの強制を使用して) 連鎖させたいので、次のようなことをしていることに気付きます。
class Expensive {
var fooPromise : Promise<Foo>?
var barPromise : Promise<Bar>?
func doExpensiveFoo(force: bool = false) -> Promise<Foo> {
if let existing = fooPromise where existing.pending || (existing.fufilled && !force) {
// Return the existing promise
return existing
}
// Start a new Foo
return firstly {
// ...
}
}
func doExpensiveBar(force: bool = false) -> Promise<Bar> {
if let existing = barPromise where existing.pending || (existing.fufilled && !force) {
// Return the existing promise
return existing
}
// Start a new Bar
return firstly {
// ...
}
}
}
しかし、それはかなりのボイラープレート (各プロミスのローカル変数、および各関数の開始時の既存のチャンク) のように感じるので、変数とラッパーを抽象化するための良いパターンを見た人がいるかどうか疑問に思っています?
Python から用語を借りると、それをすべて隠すデコレーターを探しています。何かのようなもの:
class Expensive {
private func startFoo() -> Promise<Foo> {
return firstly {
//..
}
}
public doExpensiveFoo = wrapExpensive(startFoo)
}
何か提案はありますか?