1

私は自分の約束を書き、それを連鎖させたいと思っていますが、結果は常に連鎖の最初のものだけです。私はそれらをどのように使用するかについて私の側に理解の問題があると思いますが、私はそれを見つけることができません。

私のコード:

-(PMKPromise*)tryTheFirstPromiseWorkflow:(TestCycleObject *)testCycleObject{

PMKPromise *promise = [PMKPromise new:^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject) {
    fulfill(PMKManifold([_addModul addSomething:testCycleObject]));
}];

promise.then(^(TestCycleObject *testCycleObject){
    testCycleObject = [_addModul addSomething:testCycleObject];
    NSLog(@"Result: %i, Fulfilled: %d", testCycleObject.result, promise.fulfilled);
    return testCycleObject;

}).then(^(TestCycleObject * testCycleObject){
    testCycleObject = [_multiModul multiSomething:testCycleObject];
    NSLog(@"Result: %i, Fulfilled: %d", testCycleObject.result, promise.fulfilled);
    return testCycleObject;
}).then(^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject){
    fulfill(testCycleObject);
});
return promise;}

最初にプロミスを作成すると、チェーンが開始されますが、プロミスの作成後は、プロミスの初期化で渡されたアクションのみが配信され、結果としてチェーンは配信されません。

私はあなたの目的を試しましたが、それでも問題が発生します:

-(void)test{
  PMKPromise *test = (PMKPromise*)[self tryTheFirstPromiseWorkflow:  [[TestCycleObject alloc] initWithDefaultValues]];
  TestCycleObject *temp = (TestCycleObject*) test.value;
  NSLog(@"Test: %i", temp.result);
}

これがプロミスと呼ばれる方法ですが、その結果は常に空です。プロミスはログの後に実行されますが、結果を取得できません。では、どうすれば私のメソッドで結果を得ることができますか。プロミスが実行されるまでメソッドを停止する必要があると思いましたが、間違っていますか?

4

2 に答える 2

1

他の答えは正しかった:

- (PMKPromise*)tryTheFirstPromiseWorkflow:(TestCycleObject *)testCycleObject{
    return [PMKPromise new:^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject) {
        fulfill(PMKManifold([_addModul addSomething:testCycleObject]));
    }].then(^(TestCycleObject *testCycleObject){
        testCycleObject = [_addModul addSomething:testCycleObject];
        NSLog(@"Result: %i, Fulfilled: %d", testCycleObject.result, promise.fulfilled);
        return testCycleObject;
    }).then(^(TestCycleObject * testCycleObject){
        testCycleObject = [_multiModul multiSomething:testCycleObject];
        NSLog(@"Result: %i, Fulfilled: %d", testCycleObject.result, promise.fulfilled);
        return testCycleObject;
    }).then(^(PMKPromiseFulfiller fulfill, PMKPromiseRejecter reject){
        fulfill(testCycleObject);
    });
}

あなたは最初の約束を返していました。したがって、その結果のみが得られます。then最後の結果を取得するには、 から promise を返す必要があります。

それぞれthenが新しい promise を返します。これは promise に関する重要な理解ですが、人々がこれに気付いていないことは非常に一般的です。新しい各 promise はthen、チェーン内のそのブロックの非同期タスクを表します。

チェーンの早い段階で promiseを実行できることthenは、非常に役立つ場合があります。

于 2015-03-06T06:36:08.220 に答える
1

プロミスは不変です。プロミスに追加thenすると、元のプロミスは変更されませんが、新しいプロミスが作成されます。

return代わりに、次のpromise.thenブロックを実行する必要があります。

// note the `return here`
return promise.then(^(TestCycleObject *testCycleObject){
    testCycleObject = [_addModul addSomething:testCycleObject];
    NSLog(@"Result: %i, Fulfilled: %d", testCycleObject.result, promise.fulfilled);
    return testCycleObject;

}).
于 2015-01-30T12:34:10.943 に答える