2013-11-12 2 views
5
var http = require('http'); 
var s = http.createServer(function (req, res) { 
     res.writeHead(200, {'Content-Type': 'text/plain'}); 
     res.write('Hello\n'); 
     setInterval(function() { 
      res.end(' World\n'); 
     },2000); 
     console.log("Hello"); 
}); 
s.listen(8080); 

После запуска сервера выше, я бег,Узел JS, задержка ответа

curl http://127.0.0.1:8080 

я получить требуемую задержку. выход:

Hello <2 seconds> World 

Но в браузере все содержимое загружается через 2 секунды.

Hell World <together after 2s> 

Что я делаю неправильно?

+1

Подсказка: - «res.end()» дает полный результат, который будет предоставлен браузеру. поэтому, как только вызывается метод end, ответ будет передан браузеру. Я понимаю, что это не ответ, но это может помочь. – Pranav

ответ

7

Следующий фрагмент кода открывает поток ответов с клиентом и передает его клиенту. Итак, в curl вы получите «Hello» first и «World» через 2 секунды (так как вы установили интервал в 2000 миллисекунд).

 res.write('Hello\n'); 
     setInterval(function() { 
      res.end(' World\n'); 
     },2000); 

Но браузер отображает его только после получения полного потока ответов. Вот почему вы получаете ответ через 2 секунды.

Это полностью поведение браузера. Он не использует поток ответа до получения всего ответа. Как только поток будет закрыт, весь ответ будет готов к использованию. Тем не менее, в PHP есть способ сбросить поток ответов, если это необходимо.

Однако, если вы часто просматриваете данные, это не лучший способ сделать это. Я бы предпочел предложить вам использовать Comet technique или websockets.

Надеюсь, это то, что вы ищете.

+0

, но есть ли способ, которым эту функцию можно подделать в браузере с помощью узла? –

3

поведение браузера отличается от curl. браузер не будет отображать страницу, пока не назовете res.end(). поэтому, если вы хотите загрузить часть веб-страницы после задержки, вам нужно загрузить эту вторую часть отдельно через websocket или запрос ajax. Я рекомендую использовать websocets. взгляните на socket.io, это простой способ использования websockets в node.js.

+0

спасибо, socket.io - именно то, что я хотел. –

+1

@JayaramPai приветствую вас, рад, что это помогло :) –

0
// simulate delay response 
app.use((req, res, next) => { 
    setTimeout(() => next(), 2000); 
}); 
Смежные вопросы