自己的 Promisekit 承诺没有正确响应

Posted

技术标签:

【中文标题】自己的 Promisekit 承诺没有正确响应【英文标题】:Own Promisekit promises do not response properly 【发布时间】:2015-01-30 11:38:20 【问题描述】:

我写了自己的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);

这就是我所说的承诺,但它的结果总是空的。承诺在我的日志之后执行,但我无法获取结果。那么我怎样才能在我的方法中得到结果。我认为该方法必须停止,直到承诺运行,我错了吗?

【问题讨论】:

【参考方案1】:

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

相反,您需要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;

).

【讨论】:

我编辑我的原始帖子,因为我没有解决问题。还有什么我想念的吗?【参考方案2】:

另一个答案是正确的:

- (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 块的异步任务。

能够then 链中较早的承诺有时非常有用。

【讨论】:

以上是关于自己的 Promisekit 承诺没有正确响应的主要内容,如果未能解决你的问题,请参考以下文章

在 PromiseKit 6 中正确链接多个 Promise

PromiseKit firstlyOn 样式方法

保存 promise 实现和拒绝 promisekit

返回使用另一个 PromiseKit 承诺的承诺

iOS(ObjC)PromiseKit - 在承诺中返回承诺

PromiseKit 分支承诺