我正在使用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);
})
有人可以向我解释为什么它不能以这种方式工作吗?即使其中一个承诺被拒绝,它也总是执行最后一个承诺并且不去捕捉。
答案 0 :(得分:3)
目前在您的Promise链中,您不使用先前函数调用的结果。当前一个未解决时,您运行下一个承诺。因此,即使其中一项功能:validateGovernorate
,validateCities
,searchBySpecialityAndByCities
被错误拒绝,最终的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
个阻止:validateGovernorate
,validateCities
,searchBySpecialityAndByCities
。如果您在那里抛出错误或拒绝错误。
检查this article是否有很好的说明承诺是如何运作的。