等待承诺 - 代码挂起

Kat*_*oak 0 javascript node.js promise

我第一次使用Javascript Promises并遇到了一些我不理解的东西.

我想要做的是创建一个验证阶段,它运行并检查事情 - 最终等待所有承诺解决.

为此,我创建了一个验证承诺:

 validate = function(data) {
     var p = new Promise(function(resolve, reject)){
Run Code Online (Sandbox Code Playgroud)

在这里,我为所有不同的事情定义一个promises数组:

         var all_promises = Array();
Run Code Online (Sandbox Code Playgroud)

现在做这样的Sequelize调用,同时将promises添加到这个数组中(Sequelize返回promises):

         all_promises.push(resBooking);
         resBooking.count(...).then(...).catch(...);
Run Code Online (Sandbox Code Playgroud)

我有记录声明,证明我们已经通过,一切都很花哨.现在我需要做的就是等待!

        Promise.all(all_promises).then(function(){
            p.resolve();
        });
Run Code Online (Sandbox Code Playgroud)

但这个愚蠢的事情仍然悬而未决 - 等待一些事情要完成.没有CPU使用率.我究竟做错了什么?

小智 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;
};
Run Code Online (Sandbox Code Playgroud)

换句话说,打电话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);
};
Run Code Online (Sandbox Code Playgroud)

不过,我不确定上述内容是否符合您的要求.我不知道是什么resBooking,或者resBooking.count.在任何情况下,你会被等待的resBooking承诺,而不是的结果thencatch你挂吧.根据您要完成的任务,您可能需要

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