如果 运行 中已经有一个待处理的 PromiseKit promise,那么返回待处理 PromiseKit promise 的最佳 Swift 模式是什么?
What's the best Swift pattern for returning a pending PromiseKit promise if one is already in running?
我有一些昂贵的承诺,在不同的地方被调用。理想情况下,我只想链接现有的飞行承诺(使用可选的强制),所以我发现自己在做这样的事情:
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 {
// ...
}
}
}
但这感觉像是相当多的样板文件(每个 promise 的局部变量,以及每个函数开头的现有块),所以我想知道是否有人看到了一个好的抽象模式去掉变量和包装器?
借用 Python 的一个术语,我正在寻找一个可以隐藏所有这些的装饰器。类似于:
class Expensive {
private func startFoo() -> Promise<Foo> {
return firstly {
//..
}
}
public doExpensiveFoo = wrapExpensive(startFoo)
}
有什么建议,或者我应该考虑自己动手吗?
我在你的例子中没有看到任何 Foo 和 Bar 的公共基础。但是即使 if 他们会有一个 Swift 仍然不支持泛型类型参数的协变。首先,您需要为这两种类型创建一个通用协议。也许这可以帮助您走上正轨:
Storing generic objects in Swift Array
我不是专家,但这个模式对我有用:
private var fooPromise : Promise<Foo>?
func doExpensiveFoo() -> Promise<Foo> {
if let fooPromise = self.fooPromise, fooPromise.isPending {
// return the pending promise
return fooPromise
}
// reassign a newly created promise
fooPromise = firstly {
// do your thing
...
}
return fooPromise!
}
我喜欢这种模式的地方在于,该方法在内部处理挂起状态,并且如果在完成后调用,promise 会自动重新执行。这允许调用者不知道内部机制或承诺的状态。显然,如果您需要调用者参与决策,则保留 "force" 标志方法。
我有一些昂贵的承诺,在不同的地方被调用。理想情况下,我只想链接现有的飞行承诺(使用可选的强制),所以我发现自己在做这样的事情:
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 {
// ...
}
}
}
但这感觉像是相当多的样板文件(每个 promise 的局部变量,以及每个函数开头的现有块),所以我想知道是否有人看到了一个好的抽象模式去掉变量和包装器?
借用 Python 的一个术语,我正在寻找一个可以隐藏所有这些的装饰器。类似于:
class Expensive {
private func startFoo() -> Promise<Foo> {
return firstly {
//..
}
}
public doExpensiveFoo = wrapExpensive(startFoo)
}
有什么建议,或者我应该考虑自己动手吗?
我在你的例子中没有看到任何 Foo 和 Bar 的公共基础。但是即使 if 他们会有一个 Swift 仍然不支持泛型类型参数的协变。首先,您需要为这两种类型创建一个通用协议。也许这可以帮助您走上正轨:
Storing generic objects in Swift Array
我不是专家,但这个模式对我有用:
private var fooPromise : Promise<Foo>?
func doExpensiveFoo() -> Promise<Foo> {
if let fooPromise = self.fooPromise, fooPromise.isPending {
// return the pending promise
return fooPromise
}
// reassign a newly created promise
fooPromise = firstly {
// do your thing
...
}
return fooPromise!
}
我喜欢这种模式的地方在于,该方法在内部处理挂起状态,并且如果在完成后调用,promise 会自动重新执行。这允许调用者不知道内部机制或承诺的状态。显然,如果您需要调用者参与决策,则保留 "force" 标志方法。