Javascript在循环内推送元素,不会影响循环外的数组

Posted

技术标签:

【中文标题】Javascript在循环内推送元素,不会影响循环外的数组【英文标题】:Javascript Pushing elements inside a loop, doesn't affect the array outside the loop 【发布时间】:2015-07-10 16:19:09 【问题描述】:

我有一个空数组,我想在循环内将项目推送到其中。一旦跳出循环,数组就会丢失所有信息

var result = [];
        users.find(, username: true, isOnline: true, uniq: true, _id: false, function(err, cursor) 
            cursor.each(function(err, item) 
                result.push(item);
                console.log(result); //every iteration the array shows fine
            );

            console.log(result); //array is empty
        );

        console.log(result); //array is empty

【问题讨论】:

cursor 到底是什么? each 方法是否异步工作?如果不是,那么您对正在发生的事情的解释是没有意义的。我不希望 .each 是异步的。 each 必须是异步的。这种方法从何而来?您应该指定您正在使用的框架/库。 这是 MongoDB 的东西吗? 这是 MingoDB,它在他们的网站上说 cursors 具有每个功能。 【参考方案1】:

这可能是因为users.findcursor.each 函数可能是异步的,所以你的第二个console.log 在cursor.each 执行之前执行,而你的第三个console.log 在users.find 之前执行

【讨论】:

第二个console.log语句在users.find的回调中执行 只有在每个函数都是异步的情况下才会出现这种情况 aw04 每个函数可能是异步的,在 javascript 中它是 forEach 迭代数组的同步。【参考方案2】:

看起来你在使用Mongoskin,你可以使用toArray方法将光标转换为Array,这似乎是你想要的。 看看这个:

http://www.hacksparrow.com/mongoskin-tutorial-with-examples.html

db.collection('stuff').find().toArray(function(err, result) 
    if (err) throw err;
    console.log(result);
);

所以您的代码将如下所示:

var result = [];
        users.find(, username: true, isOnline: true, uniq: true, _id: false)
        .toArray(function(err, cursor) 
            // cursor is now an array. forEach is sync.
            cursor.forEach(function(item) 
                result.push(item);
                console.log(result); //every iteration the array shows fine
            );

            console.log(result); // Should not be empty now
            // Add more code in here, if you want to do something with
            // the result array
        );
        // Still empty, because find is async.
        // Your code should go inside of the users.find call
        // and not here
        console.log(result);

这是您将在 node.js 中经常处理的事情。对于异步代码,其余代码必须放在异步调用内部。例如,您可以继续处理回调,或使用 Promises。

【讨论】:

或者如果你不喜欢 CB 或 promises 你可以使用 Async/waterfall 库

以上是关于Javascript在循环内推送元素,不会影响循环外的数组的主要内容,如果未能解决你的问题,请参考以下文章

javascript在数组的循环中删除元素

影响错误元素的 Jquery 动画回调

我还没有找到答案,为啥在 switch case 中 continue 会影响 switch 外部的循环,但 break 不会“破坏”循环?

使用循环计算数组中新推送的数据

带有innerHtml循环的Javascript幻灯片不起作用

在循环内使用 indexOf 是一个坏主意吗?