在地图上承诺全部,然后优先

时间:2018-08-21 23:36:20

标签: javascript promise es6-promise

我无法重构以下代码。我似乎无法获得所有承诺均已解决的then()。我做一个数据库查询,做三个异步调用,每个返回promise。在这段代码中,我的全部工作排在第一位

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"))

1 个答案:

答案 0 :(得分:0)

我不得不重新格式化以解决编译错误,但是...

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

b)用promise解决返回的promise.all的promise链可防止返回的promise保持待处理状态(在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