我正在努力让Promise链正确地为我工作。
我认为问题归结为理解之间的区别:
promise.then(foo).then(bar);
和
promise.then(foo.then(bar));
在这种情况下,我正在写foo
和bar
,我正在努力让签名正确。 bar
确实采用foo
生成的返回值。
我有后者工作,但我的问题是我需要做些什么来让前者工作?
与上述相关的是完整代码(如下)。我没有按照我期望的顺序打印不同的日志(期待log1
,log2
,log3
,log4
,log5
,但是得到log3
,log4
,log5
,log1
,log2
)。我希望如上所述,我也能做到这一点。
var Promise = require('bluebird');
function listPages(queryUrl) {
var promise = Promise.resolve();
promise = promise
.then(parseFeed(queryUrl)
.then(function (items) {
items.forEach(function (item) {
promise = promise.then(processItem(transform(item)))
.then(function() { console.log('log1');})
.then(function() { console.log('log2');});
});
}).then(function() {console.log('log3')})
).then(function() {console.log('log4')})
.catch(function (error) {
console.log('error: ', error, error.stack);
});
return promise.then(function() {console.log('log5');});
};
答案 0 :(得分:2)
promise.then(foo).then(bar);
和promise.then(foo.then(bar));
之间的区别是什么?
第二个是完全错误的。 then
方法将回调作为其参数,而不是promise。该回调可能会返回一个promise,所以第一个相当于
promise.then(function(x) { return foo(x).then(bar) })
(假设foo
也返回一个承诺)。
你的整个代码似乎搞砸了一下。它应该阅读
function listPages(queryUrl) {
return parseFeed(queryUrl)
.then(function (items) {
var promise = Promise.resolve();
items.forEach(function (item) {
promise = promise.then(function() {
console.log('log1');
return processItem(transform(item));
}).then(function() {
console.log('log2');
});
});
return promise;
}).then(function() {
console.log('log3')
}, function (error) {
console.log('error: ', error, error.stack);
});
}