PromiseKit实现和拒绝约定

7ba*_*all 3 asynchronous swift promisekit

我正在使用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(...)
  }
}
Run Code Online (Sandbox Code Playgroud)

tot*_*tiG 5

您可以返回Promise结果,而不是使用执行和拒绝。在下面,我创建了一个函数,向您展示如何实现:

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
}
Run Code Online (Sandbox Code Playgroud)

通过不使用完全填充和拒绝,您还可以清理代码并将conditionB检查移至新功能,例如:

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)
}
Run Code Online (Sandbox Code Playgroud)

您是否正在使用PromiseKit扩展基金会?它有助于简化Promises的联网呼叫。您可以在此处获取扩展名:https : //github.com/PromiseKit/Foundation