链接承诺(蓝鸟)

chaining promise (bluebird)

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

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

在我的控制器中(见下面的代码)我总是在包含 "res.send(results)"

的 then 中得到第一个承诺结果
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);
})

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

目前在您的 Promise 链中,您没有使用之前函数调用的结果。你运行下一个承诺,上一个没有解决的时候。因此,即使其中一个函数:validateGovernoratevalidateCitiessearchBySpecialityAndByCities 被错误拒绝,最终的 then 也会被调用为 anycase.

为了解决这个问题,运行 下一个函数,当上一个承诺被解析时:

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 那里很好地描述了 promises 是如何工作的。