Узел Синхронные циклы - PullRequest
0 голосов
/ 27 марта 2019

У меня есть функция.

function async extractTars (tarList) {
  try {
    for (let i = 0; i < tarList.length; i ++) {
      // I need this loop to be sync but it isn't hitting the next iteration
      return new Promise((resolve, reject) => {
        fs.createReadStream(`${PATHS.TAR}/${tarList[i]}`)
          .pipe(tar.extract(PATHS.GZ))
          .on('error', err => reject(err))
          .on('finish', () => resolve())
      })
    }
    // What is the correct way to resolve this async fn? Should i just return or will it resolve anyway after the loop?
  } catch (e) {
    // handle error
  }
}

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

Любая помощь будет высоко ценится!

1 Ответ

2 голосов
/ 27 марта 2019

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

returnвнутри for остановит цикл и завершит функцию, возвращающую new Promise

function async extractTars (tarList) {
  try {
    for (let i = 0; i < tarList.length; i ++) {
      // I need this loop to be sync but it isn't hitting the next iteration
      await new Promise((resolve, reject) => {
        fs.createReadStream(`${PATHS.TAR}/${tarList[i]}`)
          .pipe(tar.extract(PATHS.GZ))
          .on('error', err => reject(err))
          .on('finish', () => resolve())
      })
    }
    // What is the correct way to resolve this async fn? Should i just return or will it resolve anyway after the loop?
  } catch (e) {
    // handle error
  }
}

И просто, чтобы прояснить ситуацию:

Мне нужен этот цикл для синхронизациино он не переходит к следующей итерации

Этот цикл не будет синхронизированным, он будет выглядеть как синхронный, когда используется async/await, но вы не можете сделать асинхронный код синхронным.И createReadStream является асинхронным.

И относительно:

Как правильно решить эту асинхронную функцию fn?Должен ли я просто вернуться или он все равно разрешится после цикла?

Когда все итерации выполнены или выдается ошибка (поскольку вы ловите ее, а не отклоняете), то есть вы читаете всефайлы в tarList, функция будет разрешена.Поскольку вы ничего не возвращаете, undefined будет разрешенным значением.

С MDN :

Когда оператор возвращает используется в теле функции, выполнение функции остановлено.Если указано, заданное значение возвращается вызывающей функции.Например, следующая функция возвращает квадрат своего аргумента x, где x - это число.

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