【问题标题】:chaining promise (bluebird)链接承诺(蓝鸟)
【发布时间】:2016-04-06 10:09:21
【问题描述】:

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

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

在我的控制器中(见下面的代码)我总是在包含“res.send(results)”的情况下得到第一个承诺结果

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 被拒绝,它也总是执行最后一个 then 而不会去 catch。

【问题讨论】:

  • promise then 接受一个函数,而不是一个 promise 作为参数。
  • 要添加到@KaiHao 的评论 - 如果你想像这样链接承诺,你需要传递一个函数,返回一个承诺给.then
  • 好的,我明白了,所以解决方案是 then(function() { call_my_function })
  • 您应该会在控制台中看到来自 bluebird 的警告,告诉您问题出在哪里 - 您没有看到吗?

标签: javascript node.js bluebird


【解决方案1】:

当前在您的 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,那里很好地描述了承诺的工作方式。

【讨论】:

    猜你喜欢
    • 2015-09-05
    • 1970-01-01
    • 1970-01-01
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2014-11-06
    • 2015-09-06
    相关资源
    最近更新 更多