【发布时间】: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。
-
writeAwriteB和writeC函数返回什么?如果承诺,您是否要等待每个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