2015-01-30 3 views
1

Я написал свое собственное обещание и хочу его связать, но результат всегда только первый в цепочке. Я думаю, что на моей стороне есть проблема понимания, как использовать их, но я не могу ее найти.Собственные обещания Promisekit не отвечают должным образом

Мой кода:

-(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); 
} 

Это, как я называю обещание, но результат этого всегда пусто. Обещание выполняется после моего журнала, но тогда я не могу получить результат. Итак, как я могу получить результат в моем методе. Я думал, что метод должен остановиться до тех пор, пока не будет выполнено обещание, я ошибаюсь?

ответ

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; 

}). 
+0

I Редактировать оригинальное сообщение, потому что я не решаю проблему. Есть что-то еще, что я пропустил? –

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, чтобы получить последний результат.

Каждый then возвращает новое обещание, это ключевое понимание с обещаниями, но очень часто люди этого не понимают. Каждое новое обещание представляет асинхронную задачу для этого блока then в цепочке.

Будучи в состоянии then обещаний ранее в цепочке, иногда очень полезно.