最近碰到的一個(gè)問題如下(代碼僅為示意):
var rcds = [
'col_1',
'col_2',
'col_3',
'col_4',
'col_5',
'col_6',
'col_7',
]
var tasks = [];
for (var i = 0; i < rcds.length; i++) {
var rcd = rcds[i]
tasks.push(function(callback) {
request('http://localhost:8080', function(err, response, body) {
console.log(rcd);
callback(null);
});
});
}
async.parallel(tasks, function(err) {
if (err) {
throw err;
}
});
本來(lái)執(zhí)行的結(jié)果應(yīng)該是輸出col_1
~ col_7
钓瞭,但是看結(jié)果的時(shí)候發(fā)現(xiàn)輸出了7個(gè)col_7
唐责。琢磨了下估計(jì)是變量rcd
在異步執(zhí)行的時(shí)候被賦值了,在SO上看到了這個(gè)回答,根據(jù)里面提到的東西把那段循環(huán)改成這樣就行了:
for (var i = 0; i < rcds.length; i++) {
var rcd = rcds[i]
tasks.push(function(callback) {
var rcd = this.rcd;
request('http://localhost:8080', function(err, response, body) {
console.log(rcd);
callback(null);
});
}.bind({rcd: rcd}));
}
其中使用了bind
把外部變量rcd
的值綁定到了回調(diào)函數(shù)中,再調(diào)用的時(shí)候就不會(huì)變了。大概好像是和closures有關(guān)询枚,還沒弄懂尝胆,回頭看。
另外因妙,嘗試重現(xiàn)這玩意的時(shí)候發(fā)現(xiàn)另一種解決辦法,就是使用forEach
:
rcds.forEach(function(rcd) {
tasks.push(function(callback) {
request('http://localhost:8080', function(err, response, body) {
console.log(rcd);
callback(null);
});
});
});
具體原因待查~