Javascript 闭包和事件

标签 javascript node.js closures eventemitter

我面临以下问题:

我在 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);
};-

最佳答案

您可以尝试使用 IIFE :

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

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

关于Javascript 闭包和事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23995233/

相关文章:

php - 动态下拉框

javascript - Angular 2.如何检测组件当前是否在视口(viewport)中

javascript - 如何用async/await重构这个函数?

node.js - Firebase 函数不打印 UTF8 特殊字符 ��

javascript - 无论如何要避免每次都创建一个 JavaScript 函数? (替代关闭)

Javascript/Node : Passed in object seems to overwrite "self" - closure issue?

javascript - 如何全屏显示带有 VideoJS 的 HTML 视频叠加层?

javascript - 记录没有 new 的构造函数

javascript - 如何使用NODE js/html在网页中显示上传的文本文件

php - 可以在 PHP 中将闭包传递给 usort 吗?