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