Представьте, что вы хотите, чтобы загрузить изображение или файл, это будет первый способ интернет научит вас идти вперед:Являются ли обратные вызовы для запросов плохой практикой в node.js?
request(url, function(err, res, body) {
fs.writeFile(filename, body);
});
Но разве это не аккумулировать все данные в body
, заполняя память? Будет ли более pipe
?
request(url).pipe(fs.createWriteStream(filename));
Или это обрабатывается внутри по аналогичной теме, буферизируя поток в любом случае, делая это несущественным?
Кроме того, если я хочу использовать функцию обратного вызова, но не body
(потому что вы все еще можете pipe
), будет этот буфер памяти все еще заполнен?
Я спрашиваю, потому что первый метод (callback) позволяет мне загружать файлы, а не запускать их параллельно (*), но я не хочу заполнять буфер, который я тоже не буду использовать. Так что мне нужен обратный вызов, если я не хочу прибегать к чему-то необычному, например async, чтобы использовать queue, чтобы предотвратить это.
(*) Что плохо, потому что если вы просто request
слишком много файлов, прежде чем они будут пройдены, асинхронная природа request
заставит узел душить до смерти в передозировке событий и потери памяти. Сначала вы получите следующее:
"possible EventEmitter memory leak detected. 11 listeners added. Use emitter.setMaxListeners() to increase limit."
И при растяжении 500 запросов на подачу 500 заполнит вашу память и узел сбоя. Вот почему вам нужен обратный вызов вместо трубы, поэтому вы знаете, когда начинать следующий файл.
Труба была бы более эффективной, поскольку она будет передавать данные в «WriteStream», поскольку данные доступны. Я не думаю, что последнее утверждение верно. – Bulkan
Кажется, что это так. Попробуйте загрузить 50 документов. Вы получите _ "возможную утечку памяти EventEmitter, обнаружен 11 слушателей. Используйте emitter.setMaxListeners(), чтобы увеличить лимит." _ Загрузите 500, и ваша память заполнит и разрушит узел. Вот почему вам нужен обратный вызов вместо трубы, поэтому вы знаете, когда начинать следующий файл. – Redsandro
Resandro, я думаю, вы запутываете потоковые, обратные вызовы и управление потоком. Это управление потоком, которое будет правильно поддерживать ограничения исходящих подключений (см. Async.queue, async.eachLimit и т. Д.), Но как в парадигме обратного вызова/буферизации, так и в потоковой парадигме вам необходимо управление потоком и управление ресурсами. Эти темы различны. –