JavaScript闭包中的变量

时间:2015-04-28 07:11:10

标签: javascript asynchronous closures

我有一个订阅不同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);
        }
    });
});

1 个答案:

答案 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>