如果一个已经在运行的 PromiseKit 承诺返回一个未决的承诺的最佳 Swift 模式是啥?

Posted

技术标签:

【中文标题】如果一个已经在运行的 PromiseKit 承诺返回一个未决的承诺的最佳 Swift 模式是啥?【英文标题】:What's the best Swift pattern for returning a pending PromiseKit promise if one is already in running?如果一个已经在运行的 PromiseKit 承诺返回一个未决的承诺的最佳 Swift 模式是什么? 【发布时间】:2016-04-13 19:14:04 【问题描述】:

我有一些昂贵的承诺会在不同的地方被调用。理想情况下,我只想链接一个现有的飞行中的承诺(带有可选的力量),所以我发现自己在做这样的事情:

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)


有什么建议吗,还是我应该考虑自己动手?

【问题讨论】:

【参考方案1】:

我不是专家,但这种模式对我有用:

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 会自动重新执行。这允许调用者对内部机制或承诺的状态一无所知。显然,如果您需要调用者成为决策的一部分,那么请保留“强制”标志方法。

【讨论】:

【参考方案2】:

在您的示例中,我没有看到 Foo 和 Bar 的任何共同基础。但是即使 if 他们会有一个 Swift 仍然不支持泛型类型参数的协变。首先,您需要为这两种类型创建一个通用协议。也许这可以帮助您走上正轨:

Storing generic objects in Swift Array

【讨论】:

以上是关于如果一个已经在运行的 PromiseKit 承诺返回一个未决的承诺的最佳 Swift 模式是啥?的主要内容,如果未能解决你的问题,请参考以下文章

PromiseKit firstlyOn 样式方法

PromiseKit 2.0:链接承诺不传递参数

返回使用另一个 PromiseKit 承诺的承诺

iOS(ObjC)PromiseKit - 在承诺中返回承诺

PromiseKit 分支承诺

PromiseKit 无法在链中命中