自己的 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