我想做类似于:
somePromiseFunc(value1)
.then(function(value2, callback) {
// insert the next then() into this function:
funcWithCallback(callback);
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();
这并没有起作用,我没能使它工作。有人建议我使用 defer()
来实现这个目的。
他们自己的文档中说我们应该在回调函数中使用 deferreds。虽然这很令人困惑,因为他们著名的“降低金字塔高度”例子都是关于回调的,但这个例子过于抽象难以理解。
因此,我看到许多人都在使用 defer
,这也是我所做的。
somePromiseFunc(value1)
.then(function(value2) {
var promise = q.defer();
funcWithCallback(function(err, dronesYouAreLookingFor){
if (!err)
promise.resolve(dronesYouAreLookingFor);
else
promise.reject(new Error(err));
});
return promise.promise;
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();
直到我通过查看源代码才发现这样也可以运行:
somePromiseFunc(value1)
.then(function(value2) {
return function() {
funcWithCallback(arguments[1]);
};
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();
为什么我不应该使用这个更简单的未记录版本?
未记录是因为尽管这看起来像是压扁金字塔,但return function(){withCB(arguments[1])}
可以工作,而return function(err, cb){withCB(cb)}
则不能。
then()
插入回调函数中,那么他们为什么不记录这个呢? 更具体地说,未记录的return function(){withCB(arguments[1])}
可以工作,但return function(err, cb){withCB(cb)}
则不行。 - Redsandro