Функция «Массив в успехе» не определена - PullRequest
2 голосов
/ 02 июля 2011

Почему этот код

for(var i = 0; i < array.length; ++i) {
    array[i]["bla"] = "check";
}

работает отлично, в то время как массив здесь, согласно firebug, неопределен:

for(var i = 0; i < array.length; ++i) {
    $.ajax({
        type: "POST",
        url: "my url",
        data: "data here",
        success: function() {
            array[i]["bla"] = "check";
        }
    });
}

Как я могу исправить эту проблему?

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

Из-за того, как работают замыкания, значение i всегда будет равно array.length в обратном вызове, потому что это то, что оно равно после выполнения цикла (в конце концов, i < array.length равно false).И эта позиция всегда не определена.Вам нужно повторно связать i внутри цикла, чтобы сделать текущее значение «залипшим».К сожалению, единственный способ сделать это в стандартном JS - это использовать еще одну функцию, например:

for (...; i++) {
    (function(boundI) {
        // boundI is now bound to the current value of i in the current scope
        // If you want, you can call boundI just "i", but make sure you understand
        // how scopes work in JS before you do.
        $.ajax({
            ...
            success: function() {
                array[boundI]["bla"] = "check";
            }
        });
    })(i); // pass in the current value of the loop index which gets bound to boundI
}
0 голосов
/ 02 июля 2011

Вы можете сделать синхронный вызов:

for(var i = 0; i < array.length; ++i) {
    $.ajax({
        type: "POST",
        async: false, //This does the magic
        url: "my url",
        data: "data here",
        success: function() {
            array[i]["bla"] = "check";
        }
    });
}

Или, чтобы сохранить синхронность

    var array = ...    
    function loadElement(i){
       if(i == array.length) return;
       $.ajax({
            type: "POST",
            url: "my url",
            data: "data here",
            success: function() {
                array[i]["bla"] = "check";
                loadElement(i+1); 
            }
        });
    }
    loadElement(0);

Надеюсь, это поможет. Приветствия

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...