Скажите forEach подождать, и в основном избегать упаковки в асинхронную функцию для использования await? - PullRequest
0 голосов
/ 28 апреля 2019

Итак, у меня проблема, вот код:

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 и протестировал без console.log внутриасинхронная функция, в результате чего [] все еще печатается первой, потому что async function - та же проблема.

Поэтому я вынужден поставить console.log (resultsArray);внутри асинхронной функции и вызова асинхронной функции.

Теперь моя проблема заключается в том, что, поскольку у меня есть другие функции, которые должны быть выполнены, будут выполняться быстрее, прежде чем асинхронная функция завершится, я должен обернуть почти все внутриасинхронную функцию и вызов других функций, чтобы избежать выполнения строк после того, как javascript будет прочитан как async, а затем продолжится.

Как я могу запретить помещать и оборачивать весь мой код в асинхронную функцию и использовать await для всего,и затем вызывать другие функции, как я могу избежать этого?

Я также пробовал это с Promise, просто используя .then после toArray (), потому что это можно вернуть обещание, но все, что естьза пределами обещания все еще выполняется, пока обещание даже не выполнено.

Я хочу сказать forEach, что после его завершения выполните console.log

возможности сделать это?Я стараюсь искать все, все, что возможно.Потому что текущая установка асинхронного вызова и вызова других функций - это что-то вроде ... во многом похоже на то, как код будет выглядеть позже.Но если нет другой возможности, тогда я думаю, что не могу решить.

Я ценю любую помощь

1 Ответ

1 голос
/ 28 апреля 2019

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, которые действительно выполняют асинхронные задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...