現在のインデックスを格納するための追加のクロージャを作成し、それを実際の関数内で使用すると、次のようにうまくいくはずです。
for (var i = 0; i < array.length; i++) {
$.getJSON("http://someapi", {
"one": two
}, (function () { // added closure...
var currentIndex = i; //...to allow declaration of additinal variables
return function (result) {
array[currentIndex].value = result.value; // use currentIndex here
};
})()); // () force immidiate execution
}
デモ- クロージャーを使用しない場合とクロージャーを使用する場合の結果の比較
DEMO を開いて をクリックRunし、コンソールの出力を確認します。
デモからのコード:
var array = [1, 2, 3, 4, 5];
// Wihtout closure i is not always as expected.
for (var i = 0; i < array.length; i++) {
$.getJSON("#", {
"one": 1
}, function (result) {
console.log('no-closure: ' + i);
});
}
// With closure stored i (currenIndex) is in the expected order
for (var i = 0; i < array.length; i++) {
$.getJSON("#", {
"one": 1
}, (function () {
var currentIndex = i;
return function (result) {
console.log('closure: ' + currentIndex);
};
})());
}