所以我遇到了一个问题,这是代码:
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中,因此我可以使用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 ...中有一些异步信息,基本上就是这样,“如果您不等待我内心,我就不会等待”。
因此,我将其包装在async中,并且在没有console.log的情况下对其进行了测试,这导致[]仍然首先打印出来,因为async函数是同样的问题。
所以我被迫放入console.log(resultsArray);在异步函数内部,然后调用异步函数。
现在我的问题是,由于我必须执行其他函数,因此要在异步函数结束之前迅速执行,因此我必须将几乎所有内容包装在异步函数中,并调用其他函数以避免执行行在javascript读取类似内容后,异步然后继续。
如何避免将整个代码包装和封装在异步函数中,并对所有内容使用await,然后调用其他函数,如何避免这种情况?
我还通过在toArray()之后仅使用.then来对Promise进行了尝试,因为它可以返回一个Promise,但是Promise之外的所有内容仍然可以在Promise尚未完成的情况下执行。
我想告诉forEach,完成后执行console.log
这样做有什么可能性?我尝试搜索所有可能的一切。因为当前,放置异步并调用其他函数有点……呵呵,就像以后的代码看起来一样。但是,如果没有其他可能性,那我就无法决定了。
感谢您的帮助
答案 0 :(得分:1)
Cursor.forEach
的第二个参数是在执行第一个回调后调用的函数。用它来处理结果数组。
resultsCollections.forEach(parseDoc, function() {
console.log(resultsArray);
//...
});
或者,您可以await
返回承诺:
(async function() {
const resultsArray = [];
function parseDoc(doc) { /*...*/ }
await resultCollections.forEach(parseDoc);
console.log(resultsArray);
})();
如何避免将整个代码包装和封装在异步函数中,并对所有内容使用await,然后调用其他函数,如何避免这种情况?
您只需要使函数async
实际执行异步任务即可。