我这样做。它似乎适合我,但它可以吗?还有更好的办法吗?
function myPromise(options) {
return Q.Promise(function(resolve, reject, notify) {
doSomthingAsync(options, function(resp) {
notify(resp);
if (resp.nextPageToken) {
options.pageToken = resp.nextPageToken;
myPromise(options).then(resolve, reject, notify);
} else {
resolve(resp);
}
});
});
}
注意:我知道可变选项是不明智的。
仅供参考:我不确定,但在ReactiveCocoa中,有一种相同的功能。
-[RACSignal subscribe:]
https://github.com/ReactiveCocoa/ReactiveCocoa/blob/1e97af8f5681b3685770eb30faf090e64c293290/ReactiveCocoaFramework/ReactiveCocoa/RACSignal.h#L115-L131
答案 0 :(得分:1)
还有更好的方法吗?
是。 .then(resolve, reject, notify);
是deferred antipattern。
使用明确的then
更好地链接可能递归的调用:
function myPromise(options) {
return Q.Promise(function(resolve, reject, notify) {
doSomthingAsync(options, function(resp) {
// if (err) return reject(err);
notify(resp);
resolve(resp);
});
}).then(function(resp) {
if (resp.nextPageToken) {
options.pageToken = resp.nextPageToken;
return myPromise(options);
} else {
return resp;
}
});
}
而不是new Q.Promise
电话,您可能可以使用其中一个callback-function helper methods。