1

我写了自己的promise,想把它链起来,但结果总是只有链中的第一个。我认为如何使用它们对我来说存在理解问题,但我找不到。

我的代码:

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

一开始我创建了 Promise,然后链启动,但是在创建 Promise 之后,它将只交付在 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

Promise 是不可变的,当你添加then一个 Promise 时,它​​不会修改原始的 Promise,而是创建一个新的 Promise。

相反,您需要returnpromise.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 回答
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在链的早期实现承诺有时非常有用。

于 2015-03-06T06:36:08.220 回答