我是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方法后成功的味精。

您能否帮助我找到上述代码的问题,感谢您在此方面的意见/建议

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

最佳答案

我建议您只使用已有的诺言,而不是创建新的诺言既更有效又避免使用诺言反模式:

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

09-07 16:22