2014-09-03 2 views
0

Я изучаю KOA и Node.JS потоки.KoaJS: как отправить частичные ответы?

То, что я пытаюсь сделать, это отправить частичный HTTP-ответ и через некоторое время отправить оставшуюся часть ответа.

app.get("/", function*(next) { 

    // TEST: 
    function delay(ms) { 
    return function(callback) { 
     setTimeout(callback, ms); 
    } 
    } 

    this.type = "text/plain"; 

    var Readable = require("stream").Readable; 
    var stream = this.body = new Readable(); 

    stream._read = function() {}; 

    stream.push('First line.\n'); 

    yield delay(2000); 

    stream.push('Last line.\n'); 

    stream.push(null); 

    console.log("done"); 

}); 

Я ожидаю, что при загрузке страницы в браузере «Первая строка». сразу же отображается и через 2 секунды также «Вторая строка». Вместо этого кажется, что ответ отправляется в целом.

Что мне здесь не хватает?

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

Узел 0.11.3 с Коа 0.10.0

ответ

0

поток по трубопроводу позже, вы не имеете возможность очистить данные внутри функции.
Проверьте код:

var koa = require('koa') 
var Readable = require('stream').Readable 
var app = koa() 

app.use(function*(next){ 

    this.type = 'text/plain' 

    var stream = this.body = new Readable() 
    stream._read = function() {} 

    // isn't piped 
    console.log(stream._readableState.pipes != null) 

    yield function (callback) { setTimeout(callback, 2000) } 

    // not yet 
    console.log(stream._readableState.pipes != null) 

    var i = 0 
    setTimeout(function f(){ 
     if (i == 0) 
      // now it is 
      console.log(stream._readableState.pipes != null) 
     stream.push(Date() + '\n'); 
     if (++i < 200) 
      setTimeout(f, 50) 
     else 
      stream.push(null) 
    }, 100) 

}) 

app.listen(80) 

Теперь, я не слишком хорошо знаком с коой, так и другое решение может существовать.

+0

Одно дополнение: лучше использовать 'nextTick' вместо' setTimeout'. Это делает множество различных потоковых модулей. – Artem

+1

@UdoG У вас получилось? – Leonid

Смежные вопросы