我认为我完全迷路了,我认为我至少对异步方面有所了解,但是这种特殊情况使我感到困惑。
我在数据库上执行搜索,并期望得到一系列结果。 然后我遍历数组,检查标志并将信息推送到数组。
但是,我在进行异步调用时出错,因为在我控制台记录finalData时,它始终为空,因此它会在应该解决之前进行解析。
这是我的尝试,尝试了两种方式:
let finalData = [];
let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);
db.find({ createdAt: { "$gte": lastWeek } }).then((records, err) => {
async function test() {
let array = _.map(records, (record) => {
db2.find({ 'foo': record.id }).then((bar, err) => {
if (bar.endDate) {
let data = `Email: ${record.email}`;
finalData.push(data);
} else {
let data = `Email: ${record.email}`;
finalData.push(data);
}
});
});
await Promise.all(array).then(() => {
console.log(finalData);
});
}
test();
});
和:
db.find({ createdAt: { "$gte": lastWeek } }).then((records, err) => {
let promise1 = new Promise((resolve, reject) => {
_.map(records, (record) => {
db2.find({ 'foo': record.id }).then((bar, err) => {
if (bar.endDate) {
let data = `Email: ${record.email}`;
finalData.push(data);
} else {
let data = `Email: ${record.email}`;
finalData.push(data);
}
});
});
resolve();
});
promise1.then(() => {
console.log(finalData);
})
});
结果相同,我做错了。
答案 0 :(得分:1)
return
回调中的map
承诺,因此array
实际上是undefined
值的数组,而不是承诺的数组finalData
数组即可手动push
到。只需用各自的价值解决您的承诺,Promise.all
就会将它们收集到一系列结果中then
回调不需要第二个err
参数-如果您的函数已经返回了Promise,则它 调用实现回调或拒绝回调。< / li>
then
和async
/ await
样式
let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);
const records = await db.find({ createdAt: { "$gte": lastWeek } });
let promises = records.map(async (record) => {
const bar = await db2.find({ 'foo': record.id });
if (bar.endDate) {
return `Email: ${record.email}`;
} else {
return `Email: ${record.email}`;
}
});
const finalData = await Promise.all(promises)
console.log(finalData);
或者:
let lastWeek = new Date();
lastWeek.setDate(lastWeek.getDate() - 7);
return db.find({ createdAt: { "$gte": lastWeek } }).then(records => {
let promises = records.map(record => {
return db2.find({ 'foo': record.id }).then(bar => {
// ^^^^^^
if (bar.endDate) {
return `Email: ${record.email}`;
// ^^^^^^
} else {
return `Email: ${record.email}`;
// ^^^^^^
}
});
});
return Promise.all(promises);
// ^^^^^^
}).then(finalData => {
console.log(finalData);
});