【发布时间】:2013-01-06 08:02:17
【问题描述】:
我想做这样的事情:
somePromiseFunc(value1)
.then(function(value2, callback) {
// insert the next then() into this function:
funcWithCallback(callback);
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();
没有用。我无法让它工作。有人建议我为此使用defer()。
他们的own docs 说我们应该为回调风格的函数使用延迟。虽然这很令人困惑,因为他们著名的 flatten the pyramid 示例都是关于回调的,但是这个示例太抽象了,无法遵循。
因此,我看到很多人使用defers,这就是我所做的:
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();
为什么我不应该使用这个更简单的无证版本?
未记录,因为虽然这看起来像 flatten the pyramid 所做的那样,return function(){withCB(arguments[1])} 有效,而 return function(err, cb){withCB(cb)} 无效。
【问题讨论】:
-
我认为他们只是在向您展示如何将回调样式函数转换为使用带有
defer的承诺,更明确的示例可以更清楚地说明所有参数是什么。一个promise可以被返回,存储在一个数据结构中,并且可以与其他promise任意组合。这是(部分)承诺的全部意义。如果您有一个没有它们的特殊情况,那么一定要使用它。但是如果你稍后重构,你可能需要将它转换为一个 Promise;就是这样。 -
但是如果在返回的函数中包装一个函数是在回调中插入
then()的合法方式,他们不会记录这一点吗?更具体地说,无证return function(){withCB(arguments[1])}有效,但return function(err, cb){withCB(cb)}无效。
标签: javascript node.js callback deferred promise