gpt4 book ai didi

javascript - Node.js Q promise ,可以使用 this() 为什么要使用 defer()?

转载 作者:数据小太阳 更新时间:2023-10-29 05:10:36 26 4
gpt4 key购买 nike

我想做这样的事情:

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说我们应该将 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();

为什么我不应该使用这个更简单的未记录版本?

未记录,因为虽然这看起来像 flatten the pyramid 所做的,但 return function(){withCB(arguments[1])}return function 时起作用(err, cb){withCB(cb)} 没有。

最佳答案

这不是使用 promise 库的合法方式。详见the promises spec Q 旨在遵守,任何你从 .then 回调返回的不是 promise 的东西都应该直接通过。

当您使用 promises 时,本质上基于回调的代码应被视为遗留

您有两个基本选项。如果您多次使用 funcWithCallback,您可以执行以下操作:

var promisedFunc = Q.nfbind(funcWithCallback);

somePromiseFunc(value1)
.then(function(value2) {
return promisedFunc();
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();

或者如果你需要传递参数:

var promisedFunc = Q.nfbind(funcWithCallback);

somePromiseFunc(value1)
.then(function(value2) {
return promisedFunc(value1, value2);
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();

如果你只用一次就可以了

somePromiseFunc(value1)
.then(function(value2) {
return Q.nfcall(funcWithCallback);
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();

或者如果你需要传递参数:

somePromiseFunc(value1)
.then(function(value2) {
return Q.nfcall(funcWithCallback, value1, value2);
})
.then(function(dronesYouAreLookingFor){
// Have a party
})
.done();

关于javascript - Node.js Q promise ,可以使用 this() 为什么要使用 defer()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14469594/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com