告诉forEach等待,并且主要避免将所有内容包装在异步函数中以使用await?

时间:2019-04-28 15:10:16

标签: javascript node.js asynchronous synchronization

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

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

这样做有什么可能性?我尝试搜索所有可能的一切。因为当前,放置异步并调用其他函数有点……呵呵,就像以后的代码看起来一样。但是,如果没有其他可能性,那我就无法决定了。

感谢您的帮助

1 个答案:

答案 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实际执行异步任务即可。