【问题标题】:Javascript closure and eventsJavascript 关闭和事件
【发布时间】:2014-07-22 14:41:36
【问题描述】:

我面临以下问题:

我在 browse 函数之后调用 foreach 循环。当rb.wsc.browse(symbol) 被调用时,程序会做一些 WebSocket 请求,当消息返回时,事件就会被触发。问题是我总是得到相同的browseData,即使我知道事件是用不同的事件发出的。我认为这是关闭问题,但我不知道如何解决。

function browse(rb, symbol, callback) {
    var result = function(wsc, browseData) {
        wsc.off('browse', result);
        wsc.off('failed', result);

        var err = null;
        if (wsc.errno < 0) {
            err = new Error("Browsing symbol " + symbol + " failed!");
            err.status = wsc.errno;
        } else {                
            saveBrowseData(rb, browseData);
        }
        callback(err, symbol);
    };
    // Register temporary listeners
    rb.wsc.on('browse', result);
    rb.wsc.on('failed', result);

    // Browse symbol
    rb.wsc.browse(symbol);
} 

RexBrowser.prototype.refresh = function() {
    var that = this;
    var browseRequestNumber = 1;

    var browseResult = function(err, symbol) {
        browseRequestNumber--;
        var item = that.getSymbol(symbol);

        _.each(item.children, function(child) {
            if (child.browse) {
                browseRequestNumber++;
                debug("Browsing: " + child.cstring);
                browse(that,child.cstring, browseResult);
            }
        });

        if (browseRequestNumber === 0) {
            that.emit('refresh', that);
        }
    };

    // Start recursive browsing
    browse(this,'$', browseResult);
};-

【问题讨论】:

  • 嗯,您对所有事件使用相同的处理程序 (result),从此时起,您的处理程序对所有事件使用相同的回调。据我所知,这就是您编写的程序。
  • 是的,我现在也可以看到了。我认为当我调用var result 时,每次调用browse 函数时都会创建新函数。所以我会有几个不同的处理程序。我发现事件的第一次发出将使用wsc.off 函数取消注册所有侦听器。 S 我必须为每个调用引入一些标签,以识别来自哪个响应的 browseData 来自。
  • 如果它做同样的事情,你创建一个新函数有什么关系?
  • 它应该存储指向callback函数的链接。当我浏览一些“符号”时,我希望能够调用属于当前浏览的“符号”的回调函数。基本上整个代码都是异步递归树遍历的一部分。

标签: javascript node.js closures eventemitter


【解决方案1】:

您可以尝试使用IIFE:

} else {
    function(rbInner, browseDataInner){
        saveBrowseData(rbInner, browseDataInner);
    }(rb, browseData);
}

这可以确保saveBrowseData 中 / 使用的变量具有调用函数时的值。

【讨论】:

  • 这没有帮助。当我调试它时,它总是用相同的browseData 调用结果函数:(
  • 至少 +1 的快速响应,即使是探针在我身边。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-21
  • 1970-01-01
  • 1970-01-01
  • 2013-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多