Правильный способ использовать обещание в обещанном цикле

Привет,

Я использую Promise для инициализации проекта узла.

Я хочу вставить в мой MongoDb имена файлов на всех моих ветках в моем репозитории git.

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

После этого я могу подготовить свой массив для вставки в базу данных на следующем обещании.

Код выглядит так:

// List all branchs
.then((branchs) => {
  let promises = [];
  let allBranchFiles = [];
  branchs.map((branch) => {
    let q = repo.checkoutBranch(branch, config.checkoutOpts)
      .then(() => repo.getCurrentBranch())
      .then((ref) => {
        return new Promise((resolve, reject) => {
          fs.readdir('./myRepo/', (err, files) => {
            files.map((file) => {
              allBranchFiles.push({fileName: file, branch: branch});
            });
            resolve(allBranchFiles);
          });
        });
      });
    promises.push(q);
  });
  return Promise.all(promises);
})

Этот код заканчивается двумя способами:

  • Первый:
    { Error: the index is locked; this might be due to a concurrent or crashed process
        at Error (native) errno: -14 }

Я уверен, что никакой другой процесс не использует git в этом репо!

  • Второе:

Все мои файлы имеют одинаковое значение для "ветки", но они находятся в разных ветках.

Спасибо за помощь, ребята!

Cya.

1 ответ

Я пытаюсь что-то, и это работает, но это некрасиво.

Я имею в виду, я использую рекурсивную функцию для выполнения своих вещей. Я лучше подожду перемен, что.

Я дам вам знать, как я заменяю свой код в вопросе.

// List all branchs
.then((branchs) => {
  return new Promise((resolve, reject) => recursiv(branchs).then(() => resolve(allBranchFiles))); 
})

И моя функция:

let recursiv = (branchs, index=0) => {
  return new Promise((resolved, rejected) => {
    repo.checkoutBranch(branchs[index], config.checkoutOpts)
      .then(() => repo.getCurrentBranch())
      .then((user) => {
        return new Promise((resolve, reject) => {
          fs.readdir('./myRepo/', (err, files) => {
            files.map((file) => {
              allBranchFiles.push({fileName: file, branch: branchs[index]});
            });
            resolve();
          });
        });
      })
      .done(() => {
        if (index < branchs.length-1) resolved(recursiv(branchs, index+1));
        else resolved();
      });
  });
};

Другие вопросы по тегам