Swift 承诺履行和拒绝约定

Swift 承诺履行和拒绝约定,swift,asynchronous,promisekit,Swift,Asynchronous,Promisekit,我用PromiseKit处理网络电话。我想看看是否有一个惯例或一个更干净的方式来尽早履行或拒绝承诺。如下图所示,有一些条件要求我提前满足或拒绝。我现在通过在后面放一个return语句来实现这一点。我觉得这是相当笨拙的,我想知道是否有更好的方法来做到这一点。谢谢 return PromiseKit { fulfill, reject in if statusCode == 200 { if conditionA { if conditionB { fulfi

我用PromiseKit处理网络电话。我想看看是否有一个惯例或一个更干净的方式来尽早履行或拒绝承诺。如下图所示,有一些条件要求我提前满足或拒绝。我现在通过在后面放一个
return
语句来实现这一点。我觉得这是相当笨拙的,我想知道是否有更好的方法来做到这一点。谢谢

return PromiseKit { fulfill, reject in
  if statusCode == 200 {
    if conditionA {
      if conditionB {
        fulfill(...)  // How do I stop the execution chain from here
        return
      } else {
        reject(...) // Or here, without having to call return every time 
        return
      }
    }
    reject(...)
  }
}

您可以返回承诺结果,而不是使用“满足”和“拒绝”。在下面,我创建了一个函数,向您展示了如何实现该功能:

func someMethod(statusCode: Int, conditionA: Bool, conditionB: Bool) -> Promise<Any> {
    if statusCode == 200 {
        if conditionA {
            if conditionB {
                return Promise(value: "Return value")
            } else {
                return Promise(error: PromiseErrors.conditionBInvalid)
            }
        }
    }
    return Promise(error: PromiseErrors.invalidStatusCode)
}

enum PromiseErrors: Error {
    case invalidStatusCode
    case conditionBInvalid
}

func-someMethod(statusCode:Int,conditionA:Bool,conditionB:Bool)->承诺

哦,伙计,这太棒了!!非常感谢。我已经接受了答案。如果你不介意的话,可以快速跟进一下:为什么我们还要像我在最初的问题中那样麻烦地使用“满足和拒绝”呢?有一些例子表明这样做是有意义的。PromiseKit在这里有一个“包装委托模式”的例子——在这里,您返回一个延迟的承诺,这将导致一个承诺在以后返回。在这种情况下,因为您返回了一个承诺,所以您需要履行或拒绝它,而不是返回一个新的承诺实例
func someMethod(statusCode: Int, conditionA: Bool, conditionB: Bool) -> Promise<Any> {
    if statusCode == 200 {
        if conditionA {
            return conditionASuccess(conditionB: conditionB)
        }
    }
    return Promise(error: PromiseErrors.invalidStatusCode)
}

    func conditionASuccess(conditionB: Bool) -> Promise<Any> {
    if conditionB {
        return Promise(value: "Return value")
    }
    return Promise(error: PromiseErrors.conditionBInvalid)
}