2

さまざまな場所で呼び出される高価な約束がいくつかあります。理想的には、既存の進行中の 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)

}

何か提案はありますか?

4

2 に答える 2