Как остановить запуск терминала при завершении функции asyn c - PullRequest
1 голос
/ 14 января 2020

Когда мой код завершает свои процессы, терминал просто продолжает работать, и мне нужно вручную закрыть его. В прошлом я использовал mon goose .disconnect (), и это, казалось, закрывало его, но это не сработало здесь, потому что, когда я использую это (даже с ожиданием), оно выключается перед всеми из 8000+ записи пишутся в мою базу данных.

Вот пример кода:

const MyFunction = array => {
  for (let i = 0; i < array.length; i++) {
    const item = new Item({
      property1: array[i].property1,
      property2: array[i].property2,
    });
    item.save();
  }
};

const Final = async () => {
  try {
    const array = [{property1, property2}] // 8,000 items long
    await SharedFunctions.connectToMongoDb();
    await MyFunction(array);
  } catch (err) {
    console.log(err);
  }
};

Final();

1 Ответ

2 голосов
/ 14 января 2020

Относительно того, что процесс узла не завершается или терминал не завершается, для этого может быть несколько причин. Как и соединения с открытыми БД, открытая ручка et c. Node достаточно capabale, чтобы увидеть, все ли закончено, и выйти из кода. Вы можете вручную вызвать process.exit после await MyFunction(); для выхода, но в идеале вам это не нужно.

, поэтому я бы также предложил использовать пакет https://github.com/mafintosh/why-is-node-running, чтобы найти любые открытые дескрипторы , Вы должны добавить его там, где вы ожидаете, что ваша программа будет завершена. Таким образом, в вашем случае это будет выглядеть так:

const log = require("why-is-node-running");

onst Final = async () => {
  try {
    await SharedFunctions.connectToMongoDb();
    await MyFunction();
    log();
  } catch (err) {
    console.log(err);
  }
};

Final();

РЕДАКТИРОВАТЬ: в соответствии с вашим последним редактированием вопроса вам нужно изменить MyFunction, чтобы это было похоже на

const MyFunction = array => {
  return Promise.all(array.map(row => {
    const item = new Item({
      "property1": row.property1,
      "property2": row.property2
    });
    return item.save();
  }));
};

Помните, что делая это многие параллельные операции могут вызвать проблемы, вы также можете попробовать это

const MyFunction = async array => {

  for (const row of array) {
    const item = new Item({
      "property1": row.property1,
      "property2": row.property2
    });
    await item.save();
  }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...