【问题标题】:Promise all in map then comes first承诺所有在地图然后首先出现
【发布时间】:2019-01-28 04:40:42
【问题描述】:

我在重构以下代码时遇到了问题。我似乎无法得到所有承诺都已解决的 then() 。我进行了一个数据库查询,执行三个异步调用,每个调用都返回承诺。在这段代码中,我的完全完成是第一位的

const writeAll = (mongo) => {
  return new Promise((resolve,rej) => {
    mongo.connect(url, function(err, client) {
      const db = client.db(dbName);
      db.collection('table').find({}).toArray(function(err, res) {  
        let all = Promise.all(res.map(x => { 
          writeA(x)
          writeB(p)
          writeC(x, db)
        }))
        .then(data => console.log(data, "done here"))
        client.close();
        resolve(all)
      });
    });
  })
}

writeAll(mongo).then( data => console.log("Totally done"))

【问题讨论】:

  • 由于您的 map 回调没有返回任何内容,因此 Promise.all 没有异步函数可以解析。它会立即使用[undefined, undefined, ] 解决。
  • @Xufox 好的,所以现在我返回了一系列承诺,没有任何改变。
  • 对我来说这很奇怪,我什至看不到“完全完成”是如何记录的。因为您没有在第 2 行返回的 Promise 中的任何地方使用 resolve。
  • writeA writeBwriteC 函数返回什么?如果承诺,您是否要等待每个 res 元素的 3 次写入解决?如果是,你必须这样做Promise.all(res.reduce((prev, x) => { return prev.concat([writeA(x), writeB(p), writeC(x,db)])}, [])).then(data => { client.close(); resolve(data)})
  • @diouze 不是每三个迭代,但我需要知道地图中的每个承诺何时完成。

标签: javascript promise es6-promise


【解决方案1】:

我不得不重新格式化一点来修复编译错误,但是......

a) 从 promise.all 的 .then 子句返回一个值,为返回的 promise 提供一个值(在 OP 中缺失),

b) 使用 promise.all 的承诺链解决返回的承诺,防止返回的承诺保持未决状态(在 OP 中缺失)

c) 注意res.map 函数不返回任何类型的值。它需要返回一个承诺,或者逻辑需要重新设计!

const writeAll = (mongo) =>
{
    return new Promise((resolve,rej) =>
    {
        mongo.connect(url, function(err, client)
        {
            const db = client.db(dbName);
            db.collection('table').find({}).toArray(function(err, res)
            {  
                resolve( Promise.all(res.map(x =>
                { 
                    writeA(x)
                    writeB(p)
                    writeC(x, db)
                    // RETURN value needed!
                }))              // res.map, Promise.all(....)
                .then(data => {
                      console.log(data, "done here");
                      client.close();
                      return data;
                }));           //  resolve, then(...);
            });                // toArray(...);
        });                    // mongo.connect
    });                        // new Promise(...)
};                             // const assign

【讨论】:

  • 我认为应该是return writeC(x, db),正如@Xufox所指出的那样
猜你喜欢
  • 2017-06-24
  • 2016-01-10
  • 2017-07-13
  • 2015-04-15
  • 1970-01-01
  • 2016-05-30
  • 1970-01-01
  • 2014-02-13
  • 1970-01-01
相关资源
最近更新 更多