0

我有以下代码:-

var express = require('express');
var events = require('events');

var app = express();
var kick = new events.EventEmitter();

app.get('/info', function(req, res) {
    console.log('at A');
    kick.once('kick', function() {
        console.log('at C');
        res.send('info');
    });
    console.log('at B');
});

app.get('/info2', function(req, res) {
    res.send('info2');
});

app.get('/kick', function(req, res) {
    kick.emit('kick');
    res.end();
});

app.listen(8080);

如果我在浏览器中输入 localhost:8080/info,我会得到预期的输出:-

at A
at B

如果我随后发出 kick 事件,我会得到预期的输出:-

at A
at B
at C

但是,如果我两次请求信息,则在第一个调用完成 kick 事件之前,第二个调用不会得到处理。这是为什么?阻塞发生在哪里?

我请求 info2 ok,而第一个 get 正在等待踢球。

4

1 回答 1

0

当一个请求开始起作用时,它期望最终收到一个res.send来完成连接。因此,在您的情况下,如果您遇到/info它为永远不会发生的事件定义回调,因此res.send不会被调用,并且请求保持阻塞(更像是挂起未阻塞)等待res.send在您的代码中仅在请求trigger('kick').

于 2015-05-08T12:59:14.290 回答