我有一些昂贵的承诺会在不同的地方被调用。理想情况下,我只想链接现有的飞行中的承诺(带有可选的力量),所以我发现自己在做这样的事情:
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)
}
有什么建议,还是我应该考虑自己动手?