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