Jquery ajax в л oop и назначить идентификатор в функции успеха - PullRequest
0 голосов
/ 29 января 2020

У меня есть foreach l oop для некоторых элементов с идентификатором, в котором у меня есть ajax вызов. В функции успеха я хочу приписать каждому ответу соответствующий идентификатор. Как я могу это сделать? Потому что в результате мой идентификатор потерян. Как я могу сделать что-то подобное:

for (i=0; i<items_to_print.length; i++) {
  var item = items_to_print[i];

  jQuery.ajax({
    url: item.url,
    dataType: "json",
    data: item.data,
    success: function(response, i) {
      items_to_print[i]['response'] = response;
    }
  });
}

Спасибо,

Ответы [ 2 ]

1 голос
/ 29 января 2020

Один из способов сделать это - замедлить l oop - только go до следующего элемента в массиве, как только вы получите ответ.

var items_to_print = [{url:"https...",data:{}},{url:"https...",data:{}},{url:"https...",data:{}}];

var count = 0;
makeCall();
function makeCall(){
    if(count >= items_to_print.length){return;}
    var _item = items_to_print[count];
    jQuery.ajax({
    url: item.url,
    dataType: "json",
    data: item.data,
    success: _response
  });
}

function _response(response){
   items_to_print[count]['response'] = response;
   count++;
   makeCall();
}
0 голосов
/ 29 января 2020

Ваша проблема здесь в том, что когда вызывается success, i указывает на последнюю позицию массива, поэтому все ответы добавляются к последнему элементу (и только к последнему, который заканчивает пердур). Это происходит потому, что замыкание, которое success создает захваты i, но сама переменная, а не ее текущее значение при определении функции, поэтому все замыкания имеют одну и ту же ссылку на переменную - переменную, которая изменяется л oop. Чтобы предотвратить это, вы можете использовать forEach вместо for l oop:

items_to_print.forEach(function(item) {
    jQuery.ajax({
        url: item.url,
        dataType: "json",
        data: item.data,
        success: function(response, i) {
           item.response = response;
        }
    });
});

Делая это таким образом, для каждого элемента в массиве, который вы вызываете функцией, и поэтому Переменная item отличается для каждого вызова, поэтому success может перехватить ее без проблем, поскольку она всегда указывает на один и тот же объект - тот, для которого был сделан запрос.

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