【问题标题】:NodeJS, callback hell, triggering class event from inside callbackNodeJS,回调地狱,从回调内部触发类事件
【发布时间】:2023-04-07 07:01:01
【问题描述】:

我正在尝试在 nodejs 中编写一个可以这样调用的服务器:

server.getData()
    .on('complete', function(){
        console.log('on complete triggered');
    });

我正在尝试 emit 来自 response.end 的回调内部的事件,在 http.get 的回调内部。像这样:

Server = function(){
    events.EventEmitter.call(this);

    this.getData = function(fn){

        var _cb;
        fn ? _cb=fn: _cb=this.parseData;
        https.get('https://api.example.com', _cb);
        return this;
    }

    this.parseData = function(resp, fn){
        var _data = '';
        var self = this;
        resp.setEncoding('utf8');
        resp.on( 'data', function(chunk){
            _data += chunk;
        });
        resp.on( 'end', function(){
            var j = JSON.parse(_data);
            self.emit('complete');
            console.log(j);
            if(fn)
                fn(j);
        });
    }
}
util.inherits(Server, events.EventEmitter);
server = new Server();

我不知道该怎么办。我得到的是我可以访问server.parseData 中的_data var resp.end 但我不能对服务器对象做同样的事情。

【问题讨论】:

  • 为什么不能用var Server = this;启动类函数?

标签: node.js asynchronous asynccallback


【解决方案1】:

parseData 中的这一行没有达到您的预期:

var self = this;

因为此时,this 是全局对象。设置时getData出现问题:

_cb=this.parseData

由于您调用_cb() 而不是this.parseData(),因此thisparseData 中的设置不正确。这是 JavaScript 中的常见问题。您可以在Server 函数中设置self,这将使其中声明的所有方法都可以访问它,或者您可以绑定它:

_cb=this.parseData.bind(this)

_cb 被调用时,这将导致this 是正确的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2015-08-18
    • 2017-08-18
    • 2017-04-06
    • 2017-05-08
    • 2017-07-19
    • 2014-11-14
    相关资源
    最近更新 更多