2016-05-15 18 views
3

をチェーン:PromiseKit 3.0は、私は約束返す関数の書き込みをしようとしている

func sample() -> Promise<AnyObject> { 
    return Promise(1) 
    .then { _ -> Void in 
     debugPrint("foo") 
    }.then { _ -> Void in 
     debugPrint("foo") 
    } 
} 

私は最後のその文のエラーを取得する:

Declared closure result 'Void' (aka '()') is incompatible with contextual type 'AnyPromise' 

私は印象の下に "ということでしたそれに関係なく、暗黙のうちに約束を返すべきである。私の考えは間違っていますか?私は明示的に?:

func sample() -> Promise<AnyObject> { 
    return Promise(1) 
    .then { _ -> Void in 
     debugPrint("foo") 
    }.then { _ -> Promise<AnyObject> in 
     debugPrint("foo") 
     return Promise(1) 
    } 
} 

おかげ

答えて

3

then(_:)によって返される約束は、クロージャの戻り値と一致します。

func sample() -> Promise<AnyObject> { 
    return Promise(1) 
    .then { _ -> Void in 
     debugPrint("foo") 
    }.then { _ -> Void in 
     debugPrint("foo") 
    } 
} 

あなたの方法を改めて教えてください。

func sample() -> Promise<AnyObject> { 
    let p1: Promise<AnyObject> = Promise(1) 
    let p2: Promise<Void> = p1.then { _ -> Void in 
     debugPrint("foo") 
    } 
    let p3: Promise<Void> = p2.then { _ -> Void in 
     debugPrint("foo") 
    } 
    return p3 
} 

あなたは今Promise<AnyObject>の期待される戻り値の型がPromise<Void>の実際の戻り値の型と一致していません見ることができます。

返すメソッドをPromise<AnyObject>にする場合は、プロミスチェーンの最後の約束がAnyObjectを返す必要があります。

func sample() -> Promise<AnyObject> { 
    return firstly { _ -> Void in 
     debugPrint("foo") 
    }.then { _ -> Void in 
     debugPrint("foo") 
    }.then { _ -> AnyObject in 
     1 
    } 
} 
+0

優れた説明をありがとう。ソースとドキュメントを読んでこれを理解するのは難しいです。'firstly 'の後のブロックの中で' debugPrint( "foo") '行のメンバー' debugPrint(_:separator:terminator:)'への曖昧なエラー '曖昧な参照を取得します。 { - >ボイド でdebugPrint( "FOO") _} .then {_ - で> ANYOBJECT 'プロミスを返す.then {満たす、= 1 VAR魚に拒否}。しかし、私は、次への置き換え1 } 'それはうまくいく@JefferyThomas – bunana

2

あなたが最初の例では、それの呼び出し、Voidに指定するものは何でもthen呼び出しが戻るような約束を返す必要があります。

2度目の試行では、もう少し近づいていますが、無関係なPromiseを返すことになりました。これは、もう一度1で実行しなければなりません。

代わりにこのコードを試してみてください。

func sample() -> Promise<AnyObject> { 
    return Promise<AnyObject> { fulfill, reject in 
     return Promise<AnyObject>(1) 
     .then { _ -> Void in 
      debugPrint("foo") 
     }.then { _ -> Void in 
      debugPrint("foo") 
     } 
    } 
} 

これは、今、あなたのthen年代を順に実行するだけでなく、あなたはときに関数によって返された約束に追加する他の人になる、最初の二Promiseを埋め込みますあなたのコードのどこにでも呼び出されます。

+0

ありがとう@DaveWood;あなたの例でも同じエラーが表示されています。私は最初の「then」を削除しました。ここで私は今持っているものです: 'FUNCサンプル() - >約束 { リターンの約束 { リターン約束に拒否し、果たす(1) } .then {_ - debugPrint( "foo" という)における>ボイド } } 'どのようなアイデアですか? – bunana

+0

あなたは 'then'が内側の約束ではなく外側の約束になるようにコードを再度変更しました。 –

+0

この場合、 'fulfill'を呼び出す必要がない理由が分かりますか? @DaveWood – bunana

関連する問題