Вы используете 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 - это число.