等待承诺 - 代码挂起

时间:2015-06-23 15:08:50

标签: javascript node.js promise

我第一次使用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使用率。我做错了什么?

1 个答案:

答案 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承诺,而不是thencatch的结果。根据您要完成的任务,您可能需要

validate = function(data) {
    var all_promises = Array();
    all_promises.push(resBooking.count(...).then(...).catch(...));
    return Promise.all(all_promises);
};