gpt4 book ai didi

javascript - 告诉 forEach 等待,并避免将所有内容包装在异步函数中以使用 wait?

转载 作者:行者123 更新时间:2023-12-01 01:03:00 26 4
gpt4 key购买 nike

所以我遇到了问题,这是代码:

const resultsArray = [];

function parseDoc(doc) {
const docStringified = JSON.stringify(doc);
console.log(docStringified);
docObject = JSON.parse(docStringified);
resultsArray.push(docObject.name);
};

resultsCollections.forEach(parseDoc);

console.log(resultsArray);

我使用的是 MongoDB,因此 resultsCollections 是一个 CommandCursor,我将其放入 forEach 中以将结果推送到数组中,这样我就可以使用 Array.every() 来匹配集合是否已存在,如果不存在则创建一个。

现在,如果您现在查看代码,日志中会发生以下情况:

> []
> whatever would come from docstringify
> and if there is a second collection, it would be printed here too, because of forEach

现在我的问题是,如果你看一下程序的顺序,resultsArray 在 resultsCollections.forEach(parseDoc) 之后,但它首先打印。

 

我想要的日志是这样的:

> whatever would come from docstringify
> and if there is a second collection, it would be printed here too, because of forEach
> []

如果可能的话,无需做太多事情。

 

我知道的是,那是因为 forEach... 里面有一些异步的东西,基本上是这样的,“如果你不把await放在我里面,我就不会等待”。

所以我将它包装在 async 中,并在 async 函数内没有 console.log 的情况下对其进行了测试,这导致 [] 仍然首先被打印,因为 async 函数是同样的问题。

 

所以我被迫把 console.log(resultsArray);在 async 函数内部并调用 async 函数。

现在我的问题是,由于我还有其他必须执行的函数,这些函数将在异步函数结束之前快速执行,因此我必须将几乎所有内容都包装在异步函数中并调用其他函数以避免执行行在 javascript 读取之后,异步,然后继续。

如何防止将整个代码放入并包装到异步函数中并使用await 处理所有内容,然后调用其他函数,如何避免这种情况?

我还通过在 toArray() 之后使用 .then 来尝试使用 Promise,因为它可以返回一个 Promise,但 Promise 之外的所有内容仍然会在 Promise 尚未完成时执行。

 

我想告诉forEach,它完成后执行console.log

有哪些可能性可以做到这一点?我尝试寻找所有可能的东西。因为当前,放置异步并调用其他函数有点呵呵......很像稍后代码的样子。但如果没有其他的可能性,那么我想我无法决定。

感谢您的帮助

最佳答案

Cursor.forEach第二个参数是执行第一个回调后回调的函数。使用它来处理结果数组。

 resultsCollections.forEach(parseDoc, function() {
console.log(resultsArray);
//...
});

或者,您可以等待返回的 promise :

 (async function() {
const resultsArray = [];

function parseDoc(doc) { /*...*/ }

await resultCollections.forEach(parseDoc);

console.log(resultsArray);
})();

How can I prevent putting and wrapping my entire code inside an async function and use await for everything, and then call the other functions, how can I avoid that?

您只需使函数async真正执行异步任务即可。

关于javascript - 告诉 forEach 等待,并避免将所有内容包装在异步函数中以使用 wait?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55891615/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com