Javascript array.push在FF中不起作用,但在Chrome中起作用。。。有什么想法吗?

Javascript array.push在FF中不起作用,但在Chrome中起作用。。。有什么想法吗?,javascript,jquery,arrays,Javascript,Jquery,Arrays,这只适用于Chrome,不适用于FF: 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); };

这只适用于Chrome,不适用于FF:

    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);
var菜单=新数组();
$.coach.db(“foo”).allDocs({
成功:功能(d){

对于(var i=0;i您的
success
函数,一旦您收到来自$.coach.db的响应,那么当您到达
console.log(menu);
时,您仍然会得到初始值。

尝试声明
var menu=[];
而不是
new Array()
,这应该不会有任何区别,但您永远不会知道

另外,尝试将
console.log(menu);
放入循环中,然后看到……哦,等等

忘记以上,我只是重新阅读代码


我很确定
allDocs()
是一个异步函数。您试图在启动函数后,但在函数完成之前访问结果。依赖
菜单的所有代码都必须在
成功
函数中。

您的函数是否可以异步工作,以便在控制台.log(菜单)时在功能之外,它显示菜单的原始状态


例如,在jQuery中,当您使用ajax函数时,您可以将参数“async”设置为false,以便正确地将响应分配给变量。

问题在于您正在将数据推送到回调中的菜单数组。这意味着您的代码执行方式如下:

  • 创建新阵列
  • 调用$.coach.db()执行某些操作(某个异步任务,导致执行流继续)
  • 调用console.log(),它通常打印一个空数组,因为菜单是空的
  • $.coach.db()完成了它的业务,并调用了填充数组的“成功”回调

  • 但是,在某些情况下,回调在到达console.log()之前执行…因此,实际上您正在处理一个竞争条件。

    您的代码看起来不错,应该可以像您预期的那样工作。
    成功
    回调是否在到达底部的
    控制台.log
    后执行?这可能只是由于竞争条件.javascript导致的时间问题(html5 web workers除外)不是多线程的,所以没有真正的竞争条件。谢谢你的回复。我想我应该考虑一下。我想不管在ajax调用中设置变量,以后会调用它,这都是一个有点糟糕的做法。谢谢你的帮助!!