2

私は 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 を呼び出して返すにはどうすればよいですか?

ありがとう

編集:疑似コードの一部を修正

4

1 に答える 1

0

万が一、誰かの役に立てたとしても、

  1. ドキュメントから、約束の呼び出しは、呼び出し元と同じキューで行われます。したがって、コードをバックグラウンドで (最初の lengthyOperation() で) 実行したい場合は、dispatch_async などでラップする必要があります。
  2. 次のパターンで動作するようになったようです

    func lengthyOperation2() -> Promise<Test2Object> {
        return firstly {
           return lengthyOperation()
        }.then { (testObject: TestObject) -> Promise<Test2Object> in
           let test2Object = doSomethingWithTestObject(testObject)
           return Promise(test2Object)
        }
    }
    
于 2016-07-11T19:41:09.677 に答える