Javascript 链承诺(蓝鸟)

Javascript 链承诺(蓝鸟),javascript,node.js,bluebird,Javascript,Node.js,Bluebird,我用的是nodeJs和bluebird。我有methode来检查参数的有效性,所以我创建了一个模块,我有(见下面的代码),所有这些都是承诺 exports.validateSpeciality = validateSpeciality; exports.validateGovernorate = validateGovernorate; exports.validateCities = validateCities; 在我的控制器(见下面的代码)中,我总是在包含“res.send(result

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

exports.validateSpeciality = validateSpeciality;
exports.validateGovernorate = validateGovernorate;
exports.validateCities = validateCities;
在我的控制器(见下面的代码)中,我总是在包含“res.send(results)”的


有人能给我解释一下为什么它不是这样工作的吗?即使其中一个承诺被拒绝,它也始终执行最后一个,然后不去捕获。

当前在承诺链中,您不使用以前函数调用的结果。您运行下一个承诺,而上一个承诺没有解决。因此,即使其中一个函数:
validateGovernorate
validateCities
searchBySpecialityAndByCities
被错误拒绝,最终的
然后将被调用

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

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
块:
validateGovernorate
validateCities
searchBySpecialityAndByCities
。如果你在那里抛出了一个错误或者错误地拒绝了


检查是否有非常好的描述承诺是如何工作的。

当前在承诺链中,您不使用以前函数调用的结果。您运行下一个承诺,而上一个承诺没有解决。因此,即使其中一个函数:
validateGovernorate
validateCities
searchBySpecialityAndByCities
被错误拒绝,最终的
然后将被调用

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

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
块:
validateGovernorate
validateCities
searchBySpecialityAndByCities
。如果你在那里抛出了一个错误或者错误地拒绝了


检查是否有很好的描述承诺是如何工作的。

promise
然后
使用函数,而不是promise作为参数。要添加到@KaiHao的注释中-如果你想像那样链接承诺,你需要传递一个函数,该函数返回承诺给
。然后
。好的,我看到了,解决方案就是这样(function(){call(call_my_function})你应该在控制台中看到bluebird发出的警告,告诉你问题到底是什么-你没有看到吗?promise
然后
使用函数,而不是promise作为参数。要添加到@KaiHao的注释中-如果你想像那样链接承诺,您需要传递一个函数,该函数返回一个承诺给
。然后
。好的,我明白了,所以解决方案将是(function(){call_my_function})。您应该会在控制台中看到bluebird发出的警告,告诉您问题到底是什么-您没有看到吗?