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.find
和cursor.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在循环内推送元素,不会影响循环外的数组的主要内容,如果未能解决你的问题,请参考以下文章
我还没有找到答案,为啥在 switch case 中 continue 会影响 switch 外部的循环,但 break 不会“破坏”循环?