2012-01-26 62 views
2

在Chrome这只作品,而不是FF:array.push在FF中不起作用,但在Chrome中起作用......有什么想法?

var menu = new Array(); 
    $.couch.db("foo").allDocs({ 
      success: function(d) { 
        for(var i=0;i<=d.total_rows-1;i++){ 
          menu.push(d.rows[i].id); 
        }; 
      } 
    }); 
    console.log(menu); 

我可以CONSOLE.LOG “菜单” 里面的功能,而不是外部。这就像它失去了它的范围。有任何想法吗?

+0

您的代码看起来不错,应该按照您的预期工作。 – ShankarSangoli

+2

是否在'console.log'底部执行'success'回调?这可能只是时间问题,因为竞赛状况。 –

+0

javascript(html5 web workers除外)不是多线程的,所以没有真正的竞争条件 – ori

回答

3

您的success函数稍后会被调用,一旦您收到$ .couch.db的响应,那么当您到达console.log(menu);时,仍然会得到初始值。

+0

好的。感谢您的答复。我想我应该想到这一点。不管在ajax调用中设置一个变量,它会在稍后调用,我认为这有点不好。谢谢您的帮助!! – nologo

0

尝试声明var menu = [];而不是new Array() - 它应该没有任何区别,但你永远不知道。

此外,请尝试将console.log(menu);放入循环中,然后看...哦,等等。

忘掉上面的问题,我只是重新阅读代码。

我很确定allDocs()是一个异步函数。您尝试在启动该功能后访问结果,但尚未完成。所有依赖于menu的代码必须位于success函数中。

0

难道是你的函数工作异步,所以,当你的console.log(菜单)功能以外它显示菜单的原始状态。

举例来说,在jQuery的,当你使用AJAX功能,您可以参数“异步”设置为,这样的反应是正确地分配给变量。

0

问题是您正在将数据推送到回调中的菜单数组中。这意味着你的代码执行在某种程度上是这样的:

  1. 新阵列创建
  2. $ .couch.db()被调用它做一些事情(有些异步任务,这将导致执行流程继续)
  3. 的console.log()被调用通常打印空数组,因为菜单为空
  4. $ .couch.db()做完这件事的业务,并叫你的“成功”回调填补你的阵列

但是, re可以是你的回调在到达console.log()之前执行的,所以你真的在这里处理竞争条件。

相关问题