我是nodejs的新手,并努力通过下面的代码找到问题。
我想要实现的是,一个接一个地调用几个方法,如果所有调用都成功,那么返回成功,否则如果任何方法失败则抛出错误。
问题是,在执行所有方法之前,即使承诺尚未完成,main方法也会终止。
主要方法
processRequest(neworder).then(function (done) {
console.log('Successfully processed the order' + done);
res.sendStatus(200);
}).fail(function (error) {
res.status(404).send(error);
})
其他方法调用
module.exports.processRequest = function (Order) {
var deferred = Q.defer();
findX(Order)
.then(findYBasedOnPrevOutput)
.then(findZBasedOnPrevOutput)
.then(deferred.resolve())
.fail(function (err) {
console.log('Failed to process request' + err);
deferred.reject(err);
});
return deferred.promise;
}
var findX = function (order) {
var deferred = Q.defer()
db.list(order, function (address) {
console.log('Query success');
if (address == null)
deferred.reject('Error');
else {
deferred.resolve(address);
}
})
return deferred.promise;
};
我遇到的问题是,我在控制台中看到findX方法被调用后的成功。我期望在findZ方法之后获得成功。
您能否帮助我找到上述代码的问题,感谢您在这方面的意见/建议
为简单起见,我没有在这里分享其他模块,但它们与findX
非常相似答案 0 :(得分:1)
我建议你只使用你已经拥有的承诺,而不是创建一个更有效的承诺,并避免承诺反模式:
module.exports.processRequest = function (Order) {
return findX(Order)
.then(findYBasedOnPrevOutput)
.then(findZBasedOnPrevOutput)
.fail(function (err) {
// log the error, then throw it again so it is returned as a rejected promise
console.log('Failed to process request' + err);
throw(err);
});
}
并且,我建议更改findX
以使用Q能够将标准异步调用转换为返回此类承诺的调用:
var findX = function(order) {
return Q.nfcall(db.list.bind(db), order);
};
或者,将两者结合起来:
module.exports.processRequest = function (Order) {
return Q.nfcall(db.list.bind(db), Order)
.then(findYBasedOnPrevOutput)
.then(findZBasedOnPrevOutput)
.fail(function (err) {
// log the error, the throw it again so it is returned as a rejected promise
console.log('Failed to process request' + err);
throw(err);
});
}