首页 » 性感的程序员 » [nodejs]并发条件下,写入导致数组内数据相同

[nodejs]并发条件下,写入导致数组内数据相同

//dsgygb更新版

今天写的一个东西大概是这样:

var arr =[
'a','b','c','d'
]
var data = [];//定义存放数据的数组
var item = {};//定义应该存放在data里的格式为对象
async.each(arr,function(v,callback){
    item.name = v;
    data.push(item);
    callback(null);
},function(err){
   console(err);
})
console.log(data);
//data=['d','d','d','d']

然后就出了问题:返回的data内的数据一样;
在某宝的帮助下,解决了问题(将var item = {};定义在async.each()第二个参数里)
并理解了原理(data里存放的为item的地址,在外面定义导致4个并发的线程不断修改item指向的地址里的值,但是data.push进去的总是那一个地址,就得到了4个一模一样的数组值,而把item定义在asycn.each里面,每一次都重新初始化item,使得4个并发的线程中item中存放的地址不同,也就达到了预期效果).

所以正确的姿势是:

var arr =[
'a','b','c','d'
]
var data = [];//定义存放数据的数组
    async.each(arr,function(v,callback){
    var item = {};//定义应该存放在data里的格式为对象
    item.name = v;
    data.push(item);
    callback(null);
},function(err){
   console(err);
})
console.log(data);
//data=['d','d','d','d']

在此感谢dsg.