链接承诺(蓝鸟)

时间:2016-04-06 10:09:22

标签: javascript node.js bluebird

我正在使用nodeJs和bluebird。我有检测参数有效性的方法,所以我创建了一个模块(见下面的代码),所有这些都是承诺。

exports.validateSpeciality = validateSpeciality;
exports.validateGovernorate = validateGovernorate;
exports.validateCities = validateCities;

在我的控制器中(见下面的代码)我总是得到第一个承诺结果然后包含" res.send(结果)"

validator
.validateSpeciality(speciality)
.then(validator.validateGovernorate(governorate))
.then(validator.validateCities(governorate, cities))
.then(Doctor.searchBySpecialityAndByCities(speciality, cities))
.then(function (results) {
  console.log(results);
  res.send(results);
})
.catch(function (error) {
  console.log(error);
  res.status(400).send(error);
})

有人可以向我解释为什么它不能以这种方式工作吗?即使其中一个承诺被拒绝,它也总是执行最后一个承诺并且不去捕捉。

1 个答案:

答案 0 :(得分:3)

目前在您的Promise链中,您不使用先前函数调用的结果。当前一个未解决时,您运行下一个承诺。因此,即使其中一项功能:validateGovernoratevalidateCitiessearchBySpecialityAndByCities被错误拒绝,最终的then也会被调用。

要解决此问题,请在解决上一个承诺时运行下一个函数:

validator
 .validateSpeciality(speciality)
 .then(function() {
    return validator.validateGovernorate(governorate);
 })
 .then(function() {
    return validator.validateCities(governorate, cities);
 });
 .then(function() {
    return Doctor.searchBySpecialityAndByCities(speciality, cities);
 })
 .then(function(results) {
   console.log(results);
   res.send(results);
})
.catch(function (error) {
  console.log(error);
  res.status(400).send(error);
});

另外,请检查所有功能中是否有catch个阻止:validateGovernoratevalidateCitiessearchBySpecialityAndByCities。如果您在那里抛出错误或拒绝错误。

检查this article是否有很好的说明承诺是如何运作的。