Задать вопрос
doubled
@doubled

Асинхронный слив Stream в Node 0.8?

Наткнулся на забавное поведение при портирвании приложения с 0.10 ноды на 0.8. Есть такой код:
var http = require('http');
var req = http.request('http://www.google.com:80', function(res) {
    setTimeout(function() {
        res.pipe(process.stdout);
    }, 0);
});
req.end();


Он работает в node 0.10.x, но не выводит ничего в версии 0.8.x. Чтобы это исправить нужно использовать необязательные методы pause и resume:
var http = require('http');
var req = http.request('http://www.google.com:80', function(res) {
    res.pause();
    setTimeout(function() {
        res.resume();
        res.pipe(process.stdout);
    }, 0);
});
req.end();


Вроде бы сам спросил — сам ответил, но мне остается непонятным — почему так происходит?
  • Вопрос задан
  • 2984 просмотра
Подписаться 2 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 2
doubled
@doubled Автор вопроса
Да и придется ответить на этот вопрос самому (благодаря Jonathan Lonowski). Если прочитать вот здесь про изменения в новом api stream, то можно увидеть:
WARNING: If you never add a 'data' event handler, or call resume(), then it'll sit in a paused state forever and never emit 'end'.

Что в вольной интерпритиции значит — если вы не добавите обработчик данных — стрим не будет считан никогда. Можно предположить, что в предыдущей ноде дело обстоит наоборот.
Ответ написан
Комментировать
@kxyu
Мне кажется, этот пример демонстрирует смысл изменений в api stream ов: в 0.10 мы получаем res приостановленным, после pipe он запускается, и все проходит так, как ожидается. В 0.8 res стартует сразу и события data проходят до выполнения pipe.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы