2016-11-17 3 views
0

Я пытаюсь использовать вызов AJAX для обновления группы элементов изображения на странице. Список элементов для обновления хранится в массиве, а URL-адреса, назначаемые каждому изображению, извлекаются со страницы PHP через AJAX.Доступ к массиву с помощью функции обратного вызова AJAX

Код, который у меня ниже, не работает, потому что imagesArray[i] не определено, когда оно вызывается из функции обратного вызова в вызове AJAX - из-за асинхронного характера JavaScript предположительно.

var imagesArray = document.getElementsByClassName('swappableImages'); 

for (i = 0; i < imagesArray.length; i++) { 
    var requestUrl = "http://example.com/getAnImageURL.php"; 

    getDataViaAJAX(requestUrl, function(data) { 
    alert('img url=' + data.responseText); 
    imagesArray[i].src = data.responseText; 
    }); 
} 

function getDataViaAJAX(url, callback) { 
    var request = window.ActiveXObject ? 
    new ActiveXObject('Microsoft.XMLHTTP') : 
    new XMLHttpRequest; 

    request.onreadystatechange = function() { 
    if (request.readyState == 4) { 
     request.onreadystatechange = doNothing; 
     callback(request, request.status); 
    } 
    }; 
    request.open('GET', url, true); 
    request.send(null); 
} 

function doNothing() {} 

Ознакомившись вокруг него, кажется, что один из способов решения этой проблемы было бы использовать closure, однако замыкания являются то, что я до сих пор не удалось получить мою голову вокруг и примеры, которые я нашел только меня смутило в дальнейшем.

Итак, как я могу обновить каждый элемент в массиве как когда функция AJAX вернется?


Обратите внимание, что «дубликат» вопрос, который был идентифицирован версия JQuery вопроса с JQuery конкретные ответы. Я использую ванильный JavaScript.

ответ

1

Примечание:Первый пример/подход, - говорится в комментарии - удалены от ответа.

Вы можете попробовать это:

var requestUrl = "http://example.com/getAnImageURL.php"; 

for (i = 0; i < imagesArray.length; i++) { 
    (function(j) { 
    getDataViaAJAX(requestUrl, function(data) { 
     alert('img url=' + data.responseText); 
     imagesArray[j].src = data.responseText; 
    }); 
    })(i); 
} 
+0

Можете ли вы объяснить, что происходит в предложении? Это не работает, и я теперь получаю 'data.responseText не определено'. –

+0

Значение «i» не определено, поскольку функция обратного вызова будет выполняться в другом стеке вызовов и потеряла область «i». Чтобы сохранить значение i, нам нужно зафиксировать «i» в замыкании. Один из способов - использовать сразу вызываемую функцию, созданную выше во втором подходе. –

+0

Второй пример, кажется, работает отлично, но я смущен синтаксисом. Я понимаю проблему с «i», находящейся вне области видимости или иным образом недоступной в моем исходном коде, но не понимаю, как «(function (j)) ... (i)' управляет назначением значения 'i' для 'j'. И первый пример просто не работал для меня вообще - «данные», которые возвращаются из вызова AJAX, каким-то образом теряются. –

Смежные вопросы