链接承诺(蓝鸟)
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 链中,您没有使用之前函数调用的结果。你运行下一个承诺,上一个没有解决的时候。因此,即使其中一个函数:validateGovernorate
、validateCities
、searchBySpecialityAndByCities
被错误拒绝,最终的 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
阻塞所有函数:validateGovernorate
、validateCities
、searchBySpecialityAndByCities
。如果你在那里抛出错误或拒绝错误。
检查 this article 那里很好地描述了 promises 是如何工作的。
我正在使用 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 链中,您没有使用之前函数调用的结果。你运行下一个承诺,上一个没有解决的时候。因此,即使其中一个函数:validateGovernorate
、validateCities
、searchBySpecialityAndByCities
被错误拒绝,最终的 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
阻塞所有函数:validateGovernorate
、validateCities
、searchBySpecialityAndByCities
。如果你在那里抛出错误或拒绝错误。
检查 this article 那里很好地描述了 promises 是如何工作的。