我遇到一个问题,await Promise.all
在我的情况下不起作用。我附加了代码和得到的输出:
await Promise.all(allIndizes.map(async (index) => {
await axios.get(uri)
.then(async function (response) {
let searchResult = response.data.hits.hits;
console.log('Search Result: ' + searchResult);
await Promise.all(searchResult.map(async (element) => {
await primaryKeyModel.findById(element._id).exec((err, pk) => {
console.log('PK, direct after search: ' + pk);
//DO SOME STUFF HERE BUT DELETED IT TO SHORTEN THE CODE
}
})
console.log('test1');
}));
})
console.log('test2');
}));
输出如下:
test1
test2
PK, direct after search: { _id: 5bf1c0619674e2052a4f6a64 ... }
实际上,我实际上希望第一个输出是“直接在搜索后的PK”。我不明白为什么该功能没有等待?有人有提示吗,这是怎么了?我发现了类似的问题here,我采用了逻辑,但仍然无法正常工作。谢谢您的帮助。 我试图尽量缩短代码。我只删除了不影响异步执行的语句。
答案 0 :(得分:0)
Mongoose很长时间以来都支持诺言,基于回调的API已过时,在期望诺言(await
)中使用它是错误的。
then
在async
函数中是不需要的,这违背了使用async..await
的目的。
应该是:
await Promise.all(allIndizes.map(async (index) => {
const response = await axios.get(uri);
let searchResult = response.data.hits.hits;
await Promise.all(searchResult.map(async (element) => {
const pk = await primaryKeyModel.findById(element._id);
//DO SOME STUFF HERE BUT DELETED IT TO SHORTEN THE CODE
}));
}));