我面临以下问题:
我在 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/