我第一次使用Javascript Promises并碰到了一些我不理解的东西。
我想要做的是创建一个运行并检查事物的验证阶段 - 最终等待所有承诺解决。
为此,我创建了一个验证承诺:
validate = function(data) {
var p = new Promise(function(resolve, reject)){
在这里,我将为我将要做的所有不同事情定义一个promises数组:
var all_promises = Array();
现在做这样的Sequelize调用,同时将promises添加到这个数组中(Sequelize返回promises):
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);
我有记录声明,证明我们已经通过了,一切都很花哨。现在我需要做的就是等待!
Promise.all(all_promises).then(function(){
p.resolve();
});
但是这个愚蠢的事情仍然悬而未决 - 等待一些事情要完成。没有CPU使用率。我做错了什么?
答案 0 :(得分:5)
你想要的是
validate = function(data) {
var p = new Promise(function(resolve, reject)){
var all_promises = Array();
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);
Promise.all(all_promises).then(resolve);
});
return p;
};
换句话说,请致电resolve
,而不是p.resolve()
。 p.resolve
将生成运行时错误(p
不存在),这将由promise构造函数“吞噬”并导致其失败。但是,您甚至无法从外部看到被拒绝的承诺,因为您也没有从函数中返回它。
但是,尽管此代码现在可以正常工作,但您仍然在提交“promise构造函数反模式”。如果您已经拥有Promise.all
形式的新承诺,则无需构建新承诺。所以你可以写
validate = function(data) {
var all_promises = Array();
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);
return Promise.all(all_promises);
};
我不确定上述内容是否符合您的要求。我不知道resBooking
是什么,或resBooking.count
。在任何情况下,您都会等待resBooking
承诺,而不是then
和catch
的结果。根据您要完成的任务,您可能需要
validate = function(data) {
var all_promises = Array();
all_promises.push(resBooking.count(...).then(...).catch(...));
return Promise.all(all_promises);
};