Вы должны подождать, пока поток с возможностью записи запустит событие 'fini sh' .
Что происходит, так это то, что процесс завершается почти сразу, потому что он никогда не ждет request.pipe (файл), который должен быть фактически выполнен.
Одна стратегия, которая включает в себя 2 дополнительных шага:
- использовать async / awaits в циклах (также известную как асинхронная итерация ECMAScript 2018) , что-то вроде:
for await (...) {
await download(...)
}
для каждого URL-адреса, дождитесь, пока записываемый поток выдаст событие 'fini sh', что также можно сделать с помощью async / await, используя
streams.finished () в сочетании с util.promisify () const {promisify} = require('util')
const stream = require('stream')
const finished = promisify(stream.finished)
await finished(aStream)
Обратите внимание, что это очень простой c подход, который приведет к еще большей путанице в коде, и, вероятно, каждая загрузка будет выполняться последовательно, как и каждые l oop будет ждать финиша трубы sh. Вдобавок ко всему, обработка ошибок для отдельного канала будет беспорядком и многими другими проблемами. Это будет работать, но не будет хорошо.
Гораздо более понятный подход придет в изучении того, как писать asyn c каналы с Highland. js. Это будет нелегко для новичков с этим инструментом, так как это сразу потребует запуска asyn кода c с sequence
и, вероятно, также fork/merge
каналов. Если вам интересно, я могу подробнее рассказать об этом.