我无法重构以下代码。我似乎无法获得所有承诺均已解决的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"))
答案 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