我第一次使用 Javascript Promises,遇到了一些我不明白的事情。
我想做的是创建一个验证阶段,该阶段运行并检查事物 - 最终等待所有 promise 得到解决。
为此,我创建了一个验证 promise :
validate = function(data) {
var p = new Promise(function(resolve, reject)){
在这里,我为我将要做的所有不同事情定义了一个 Promise 数组:
var all_promises = Array();
现在执行类似 Sequelize 调用的操作,同时将 Promise 添加到此数组中(Sequelize 返回 Promise):
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);
我的日志记录表明我们已经度过了难关,一切都很顺利。现在我需要做的就是等待!
Promise.all(all_promises).then(function(){
p.resolve();
});
但是这个愚蠢的事情挂起了 - 它等待某些事情完成。没有 CPU 使用率。我做错了什么?
最佳答案
你想要的是
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 构造函数反模式”。当您已经拥有 Promise.all
形式的 Promise 时,您无需构建新的 Promise。所以你可以直接写
validate = function(data) {
var all_promises = Array();
all_promises.push(resBooking);
resBooking.count(...).then(...).catch(...);
return Promise.all(all_promises);
};
不过,我不确定上面的内容是否正是您想要的。我不知道 resBooking
是什么,或者 resBooking.count
。无论如何,您将等待 resBooking
promise ,而不是等待您挂起的 then
和 catch
的结果。根据您想要实现的目标,您可能想要
validate = function(data) {
var all_promises = Array();
all_promises.push(resBooking.count(...).then(...).catch(...));
return Promise.all(all_promises);
};
关于javascript - 等待 promise - 代码挂起,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31006589/