【问题标题】:Promise all not firing承诺一切不开火
【发布时间】:2018-09-01 09:03:13
【问题描述】:

我第一次尝试让 Promise 发挥作用。但是,我的Promise.all 永远不会触发。

我正在使用 node.js & express

const promises = [
    new Promise( () => {
        var query = `...`;  

        mssql.query(query, function(obj){
            finalRes['key1'] = obj.recordset;
            return true;
            //this works
        });
    }),
    new Promise( () => {
        var query = `...`;  

        mssql.query(query, function(obj){
            finalRes['key2'] = obj.recordset;
            return true;
            //this works
        });
    }),
    ...
]

Promise.all(promises).then(() => {
    res.send(finalRes);
    // this is never firing
});

我一直在谷歌搜索,但找不到解决方案。我会很感激有人指出我在这里做错了什么。

干杯

【问题讨论】:

    标签: javascript express promise


    【解决方案1】:

    您的承诺创建代码是错误的,因为它们永远不会解决。您实际上应该做的是在基于回调的代码中触发 resolve 函数。我会走得更远——让所有这些承诺都用它们的结果来解决,而不是修改一些外部价值。像这样:

    const promises = [
      new Promise( (resolve, reject) => {
        var query = `...`;  
        mssql.query(query, function(obj){
          resolve({key1:obj.recordset});
        });
      }),
      new Promise( (resolve, reject) => {
        var query = `...`;  
        mssql.query(query, function(obj){
          resolve({key2:obj.recordset});
        });
      }) // ...
    ];
    
    Promise.all(promises).then(results => {
      res.send(Object.assign({}, ...results));
    });
    

    根据查询的构建方式,您可能会走得更远——编写一个通用的查询生成器函数,该函数将查询和键作为参数,并返回一个承诺。同样,这个函数应该很容易测试。

    作为旁注,您的代码过于乐观,它还应该为每个查询提供error 回调和reject() 调用。

    【讨论】:

    • 我刚试过,但我收到错误>resolve(); ReferenceError: resolve is not defined ...知道为什么吗?
    • 因为你错过了 Promise 构造函数中的 (resolve, reject) 部分?
    猜你喜欢
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    相关资源
    最近更新 更多