【问题标题】:Using EventEmitter instead of callback?使用 EventEmitter 而不是回调?
【发布时间】:2014-11-13 18:09:40
【问题描述】:

我有一个调用ajax 的代码,它有一个callback。有没有办法可以用event emitter 替换callback

下面是我的code

 var _getPoll = function(params){
    var url = "http://localhost/poll"

    console.log(url);

    request({
        headers: {
            accept: 'application/json'
        },
        uri: url,
        method: 'GET'
    }, function(err, response, body){
        body = JSON.parse(body);
        console.log(body);
    })
}

是否可以将回调替换为如下所示的 EventEmitter。

function(err, response, body){
    body = JSON.parse(body);
    console.log(body);
}

替换

this.emit('jsonResponse', err, response, body);

【问题讨论】:

  • 我很好奇。不使用回调有什么好处?
  • @KJPrice:下一个回调总是很痛苦......这就是原因......
  • 我不明白这个问题。 EventEmitter 是一个系统,可让您在事件发生时分配回调以触发。
  • ...鉴于底部的示例代码,您仍在使用回调函数。那么为什么不给它一个名字,并使用命名函数呢?所以你有function foobar(err, response, body){,然后把foobar放在当前匿名函数的位置。或者您可以让_getPoll 将其作为参数或params 之一接收。

标签: javascript node.js events


【解决方案1】:

有没有办法可以用事件发射器替换回调。

是的。事实上,request 已经确实返回了一个事件发射器。你会听它而不是将你的回调直接传递给request() 调用。响应流结束后,它将立即发出带有正文的 complete 事件。

 function _getPoll(params) {
    var url = "http://localhost/poll";

    console.log(url);

    request({
        headers: {
            accept: 'application/json'
        },
        uri: url,
        method: 'GET'
    }).on("complete", function(response, body) {
        console.log(JSON.parse(body));
    });
}

是否可以将回调替换为this.emit('jsonResponse', err, response, body)

我不确定您的意思是否正确。不,您不能用其他回调替换回调。不能传递偶数发射器对象,也不能传递调用this.emit('jsonResponse', err, response, body) 的结果。你可能会做类似的事情

var e = new EventEmitter();
request({…}, function(err, response, body){
    if (err)
        e.emit("error", err)
    else
        e.emit('jsonResponse', response, JSON.parse(body));
})

下一个回调总是很痛苦...这就是原因...

我认为您真正在寻找的是promises。当然,它们是still callbacks(就像事件发射器一样),但它们的组合性更强。

【讨论】:

    猜你喜欢
    • 2017-04-29
    • 2020-01-19
    • 1970-01-01
    • 2017-01-07
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 2011-01-13
    • 1970-01-01
    相关资源
    最近更新 更多