我正在尝试第一次实现承诺。但是,我的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
});


我一直在搜寻东西,但找不到解决方案。我希望有人指出我在这里做错了什么。

干杯

最佳答案

您的诺言创建代码是错误的,因为它们永远无法解决。您实际上应该做的是在基于回调的代码中使用fire 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));
});


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

附带说明一下,您的代码过于乐观,它还应该为error回调提供对每个查询的reject()调用。

关于javascript - 答应一切不解雇,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52126603/

10-10 19:11