javascript - 等待 promise - 代码挂起

标签 javascript node.js promise

我第一次使用 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 ,而不是等待您挂起的 thencatch 的结果。根据您想要实现的目标,您可能想要

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/

相关文章:

node.js - Mongoose,从模型中删除属性

javascript - 需要帮助弄清楚如何编写带有条件的 Promise

javascript - 在循环中链接嵌套的 promise

javascript - 理解 promise 链接 : 'then()' get's undefined parameter as the result

javascript - 如果其他选择更改,AngularJS 删除并添加选择框选项

javascript - 为什么我的回调不能与 axios 库一起使用?

Javascript 显示/隐藏 - 我不希望它隐藏整个元素

javascript - NodeJS 模拟浏览器获取/发布请求

javascript - 从 Node 中的多个嵌套回调中返回值

javascript - 如何使用Js从用户那里获取CSS属性