【发布时间】: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