Node js中的多个promise

我是nodejs的新手,并努力寻找下面这段代码的问题。

所有我想要实现的是,一个接一个地调用几个方法,如果所有的调用都成功,那么返回成功,否则抛出一个错误,如果任何方法失败。

我的问题是,在所有的方法被执行之前,主要方法终止,即使承诺尚未满足。

主要方法

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方法之后msg成功。

你能帮我find上面的代码问题,感谢你在这方面的意见/build议

为了简单起见,我没有在这里分享其他模块,但它们与findX非常相似

我build议你只是使用你已经有的承诺,而不是创造一个更有效的新的避免承诺反模式:

 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); }); } 

而且,我build议改变findX来使用Q的能力来把一个标准的asynchronous调用变成一个返回一个这样的承诺:

 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); }); }