代码之家  ›  专栏  ›  技术社区  ›  Tomasz Golinski

答应所有人不要开枪

  •  0
  • Tomasz Golinski  · 技术社区  · 8 年前

    我第一次试着让承诺生效。然而,我的 Promise.all 永远不会开火。

    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
    });
    

    我一直在用谷歌搜索东西,却找不到解决办法。我希望有人能指出我做错了什么。

    1 回复  |  直到 8 年前
        1
  •  1
  •   raina77ow    8 年前

    你的承诺创建代码是错误的,因为它们永远不会解决。你实际上应该做的是开火 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));
    });
    

    根据查询的构建方式,您可以更进一步—编写一个通用查询生成器函数,该函数将query和key作为参数,并返回一个promise。同样,这个函数应该很容易测试。

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

    推荐文章