PromiseKit 中的承诺链接
Chaining of promises in PromiseKit
我有以下场景:
- 从服务器请求令牌
- 执行请求,即getAllNews
- 解析请求getAllNews的响应
- 保留已解析的数据
- 删除请求的令牌
我使用 promises 进行了这 5 个操作:
return [self createToken].then(^(NSString *token) {
return [self performRequestGetAllNewsUsingToken:token];
}).then(^(id responseObject) {
return [self parseNewsResponse:responseObject];
}).then(^(NewsResponseObject *newsResponseObject) {
return [self persistNewsFromArray:newsResponseObject.allNews inContext:self.context];
}).finally(^{
[self deleteToken:token];
});
我面临的问题是我无法将参数发送到 finally
- 这个 token
参数丢失了。
我考虑过在 [self performRequestGetAllNewsUsingToken:token]
之后立即将 deleteToken
作为 then
调用,但它只会在前一个解析为实际结果而不是错误时执行该操作。
无论请求结果如何,无论执行成功与否,我都应该销毁令牌。
有没有办法设置一个规则,如果执行createToken
,那么无论如何都应该调用deleteToken
,但只有在执行我的正常请求getAllNews
之后?
在闭包中捕获令牌,以便您可以在 finally 子句中访问它:
NSString* token;
return [self createToken].then(^(NSString *token_) {
token = *token_;
return [self performRequestGetAllNewsUsingToken:token];
}).then(^(id responseObject) {
return [self parseNewsResponse:responseObject];
}).then(^(NewsResponseObject *newsResponseObject) {
return [self persistNewsFromArray:newsResponseObject.allNews inContext:self.context];
}).finally(^{
[self deleteToken:token];
});
我有以下场景:
- 从服务器请求令牌
- 执行请求,即getAllNews
- 解析请求getAllNews的响应
- 保留已解析的数据
- 删除请求的令牌
我使用 promises 进行了这 5 个操作:
return [self createToken].then(^(NSString *token) {
return [self performRequestGetAllNewsUsingToken:token];
}).then(^(id responseObject) {
return [self parseNewsResponse:responseObject];
}).then(^(NewsResponseObject *newsResponseObject) {
return [self persistNewsFromArray:newsResponseObject.allNews inContext:self.context];
}).finally(^{
[self deleteToken:token];
});
我面临的问题是我无法将参数发送到 finally
- 这个 token
参数丢失了。
我考虑过在 [self performRequestGetAllNewsUsingToken:token]
之后立即将 deleteToken
作为 then
调用,但它只会在前一个解析为实际结果而不是错误时执行该操作。
无论请求结果如何,无论执行成功与否,我都应该销毁令牌。
有没有办法设置一个规则,如果执行createToken
,那么无论如何都应该调用deleteToken
,但只有在执行我的正常请求getAllNews
之后?
在闭包中捕获令牌,以便您可以在 finally 子句中访问它:
NSString* token;
return [self createToken].then(^(NSString *token_) {
token = *token_;
return [self performRequestGetAllNewsUsingToken:token];
}).then(^(id responseObject) {
return [self parseNewsResponse:responseObject];
}).then(^(NewsResponseObject *newsResponseObject) {
return [self persistNewsFromArray:newsResponseObject.allNews inContext:self.context];
}).finally(^{
[self deleteToken:token];
});