我有一个订阅不同PubNub频道的循环(不要担心PubNub细节,问题似乎是范围/闭包)。当我收到消息时,我想解决一个承诺。
下面的代码中的注释表示问题。基本上,在pubnub订阅之外,计数器i
给出了期望值,但是在订阅回调中,它不是。为什么会这样?我如何解决它?
_.times(3, function(i) {
console.log('subscribe'+i); // here counter is working fine
pubnub.subscribe({
channel_group: 'usersu' + (i + 1) + ':1',
callback: function(msg) {
console.log('recv:', msg, message, msg == message, i); // here its not! i is always 0
if (msg == message) {
console.log('resolve');
deferreds[i].resolve();
}
},
error: function(err) {
deferreds[i].reject(err);
}
});
});
答案 0 :(得分:0)
我希望你已经解决了这个问题。
我修改了您的代码,以便在浏览器上本地运行它。我声明了一个新函数订阅(因为我们不知道pub nub订阅了什么)。此代码完美运行,并打印相应的“i”值。
我认为您需要为社区提供更多的上下文和环境以进一步调试。
function subscribe(obj) {
console.log(obj.channel_group);
obj.callback("hello");
obj.error("error5");
}
_.times(3, function(i) {
console.log('subscribe' + i); // here counter is working fine
subscribe({
channel_group: 'usersu' + (i + 1) + ':1',
callback: function(msg) {
console.log('recv:', msg, "hello", "hello"==msg, i); // here its not! i is always 0
if (msg == "hello") {
console.log('resolve');
console.log(i);
//deferreds[i].resolve();
}
},
error: function(err) {
console.log(i + ": " + err);
//deferreds[i].reject(err);
}
});
});
<script src="https://github.com/jashkenas/underscore/blob/master/underscore.js"></script>