Promise.all无法正常工作/正在等待JavaScript与猫鼬结合使用

时间:2018-11-18 20:04:59

标签: javascript node.js mongoose

我遇到一个问题,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,我采用了逻辑,但仍然无法正常工作。谢谢您的帮助。 我试图尽量缩短代码。我只删除了不影响异步执行的语句。

1 个答案:

答案 0 :(得分:0)

Mongoose很长时间以来都支持诺言,基于回调的API已过时,在期望诺言(await)中使用它是错误的。

thenasync函数中是不需要的,这违背了使用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
    }));
}));