【问题标题】:PromiseKit - Return nested promisePromiseKit - 返回嵌套的承诺
【发布时间】:2016-07-10 21:46:49
【问题描述】:

我正在尝试使用 PromiseKit,但在解决这个问题时遇到了一些麻烦。我有一个类似的功能

func lengthyOperation() -> Promise<TestObject> {
   return Promise { fulfil, reject in
     dispatch_async(GlobalUserInitiatedQueue) {
       do {
          let testObject = ...
          fulfil(testObject)
       } catch {
          reject(error)
       }
     } 
   }
}

我想调用另一个函数,并返回另一个承诺

func lengthyOperation2() -> Promise<Test2Object> {
   return Promise { fulfil, reject in 
        let test2Object = ...
        if test2Object == nil {
           lengthyOperation().then { testObject: TestObject in
               let test2Object = doSomethingWithTestObject(testObject) 
              fulfil(test2Object) //Compiler error here
           }.error {
              reject(error)
           }
        } else {
           fulfil(test2Object)
        }
   }
}

我得到一个编译器错误提示

Cannot convert return expression of type 'Void' (aka '()') to return type 'AnyPromise'

几个问题:

  1. 我需要在 promise 调用中使用 dispatch_async 吗?
  2. 如何调用和返回这样的嵌套 promise?

谢谢

编辑:更正一些伪代码

【问题讨论】:

    标签: swift promisekit


    【解决方案1】:

    以防万一它帮助别人,

    1. 根据文档,promise 调用是在与 它被称为从。因此,如果我们希望代码在后台运行(在第一个 longyOperation() 中),它 将需要包装在 dispatch_async 或类似文件中。
    2. 我似乎已经按照以下模式进行了工作

      func lengthyOperation2() -> Promise<Test2Object> {
          return firstly {
             return lengthyOperation()
          }.then { (testObject: TestObject) -> Promise<Test2Object> in
             let test2Object = doSomethingWithTestObject(testObject)
             return Promise(test2Object)
          }
      }
      

    【讨论】:

    • 我认为您不需要使用 dispatch_async。也许thenOnthenInBackgroundpromisekit.org/dispatch-queues
    • 乔恩-谢谢。但是,除非我错过了它,否则我看不到在后台队列上创建自己的 Promise 的方法?
    • 您是否阅读了该链接中的最后三段? thenOn 处理主线程。 thenInBackground 调度到默认 GCD 队列。
    • 乔恩 - 我确实通过了那个链接。然而,我们似乎在谈论不同的事情。 promisekit.org/sealing-your-own-promises 谈论创建/密封你自己的承诺。同样在提供的示例中,它们似乎在后台队列上执行并使用完成处理程序完成。 thenOn 和 thenInBackground 用于继续承诺链。顺便说一句,当我谈论后台调度时,我指的是 func longyOperation() 。已编辑我的答案以使其更清晰
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-24
    • 1970-01-01
    相关资源
    最近更新 更多