你非常接近,但通过执行你的匿名函数,你最终的返回值分配给onreadystatechange
财产。你永远不会返回一个值,所以你指定undefined
。你可能想回功能:
xhr[i].open('post', 'PHP/write_and_exec_opt.php');
display_opt[i] = xhr[i].onreadystatechange = function(index) {
return function() {
if (xhr[index].readyState == 4 && xhr[index].status == 200) {
text = xhr[index].responseText.trim();
n_finished++;
console.log('display_opt', n_finished);
}
};
}(i);
xhr[i].send(data);
这就是说,它变得扑朔迷离快,而且也没有充分的理由重复创建临时的功能,这就是为什么我通常打破东西出来:前
某处(或之后,但在相同的基本范围任何情况下)你i
循环:
function createStateChangeHandler(index) {
return function() {
if (xhr[index].readyState == 4 && xhr[index].status == 200) {
text = xhr[index].responseText.trim();
n_finished++;
console.log('display_opt', n_finished);
}
};
}
在
i
循环
然后:
xhr[i].open('post', 'PHP/write_and_exec_opt.php');
display_opt[i] = xhr[i].onreadystatechange = createStateChangeHandler(i);
xhr[i].send(data);
对于它的价值,我会建议寻找到使用承诺为这样的事情,ESP。现在,他们是JavaScript的一个标准部分(如ES2015的):
Promise.all(xhrArray.map(function(xhr) {
return new Promise(function(resolve, reject) {
xhr.onreadystatechange = function() {
if (xhr.readyState == 4) {
if (xhr.status == 200) {
resolve(xhr.responseText.trim());
} else {
reject(/*...include some error perhaps...*/);
}
}
};
xhr[index].send(data);
});
})
.then(function(array) {
// `array` contains an array o the results, in the same
// order as `xhrArray`
})
.catch(function() {
// At least one XHR failed
});
它看起来像你试图在循环中使用[闭包](http://stackoverflow.com/q/750486/1048572)?看看[this](http://stackoverflow.com/a/25267864/1048572) – Bergi