Как передать значение в callback функцию

373
02 января 2018, 17:00

Как передать значение i в function чтобы после того как пришел результат для конкретной итерации можна было сохранить результат для конкретного запроса?

var points = [];
var result = [];
for (var i = 0; i < points.length; i++) {
    $.get('do-get', {apikey: 'key', values: points[i].join('|')}, function (data) {
        result[i] = data; // ответы приходят в ином порядке чем уходят запросы
    });
}
Answer 1

так?

var points = [];
var result = [];
for (var i = 0; i < points.length; i++) {
    (function(i){
        $.get('do-get', {apikey: 'key', values: points[i].join('|')}, function (data) {
            result[i] = data; 
        });
    })(i);
}

Кстати, итоговый result все равно нужно будет где-то просматривать и работать. По очевидным причинам после цикла никак этого сделать нельзя, потому что запросы ajax асинхронные... Выхода из этого может быть несколько, от глупых, до еще более глупых))

  • Например внутри callback проверять чему равно i и если оно равно points.length работать с финальным массивом:

    ...
    ...
    $.get('do-get', {apikey: 'key', values: points[i].join('|')}, function (data) {
        result[i] = data; 
        if (i == points.length)
            finalFunction(result);
    });
    ...
    ...
    function finalFunction(resArr) {
        console.log("тут работа с result ");
    }
  • Может быть сделать массив ajax запросов и воспользоваться функцией jQuery.when(), с помощью которой можно дождаться выполнения всех асинхронных запросов. Пример:

    var points = [];
    var result = [];
    var ajaxArr = [];
    for (var i = 0; i < points.length; i++) { 
        ajaxArr[i] = ajaxFunction(i);
    }
    $.when(...ajaxArr).done(function(...test){
        // в test будут все запросы по всем ajaxArr
        console.log(test);
        // запихнем в result данные
        for (var el in test) {
            result.push(test[el][0]);
        }    
        console.log(result);
    });
    function ajaxFunction(i) {    
        return $.ajax({
            url: "do-get",
            method: "GET",
            dataType: "json",
            data:  {apikey: 'key', values: points[i].join('|')}        
        });
    }
  • Может быть не стоит это делать в цикле?

Answer 2

А еще должно работать с let

var points = [];
var result = [];
for (let i = 0; i < points.length; i++) {
    $.get('do-get', {apikey: 'key', values: points[i].join('|')}, function (data) {
        result[i] = data;
    });
}
Answer 3
var points = [];
var result = [];
for (var i = 0; i < points.length; i++) {
  var context = { index: i };
  $.get('do-get', {apikey: 'key', values: points[i].join('|')}, (function (data) {
    result[this.index] = data; 
  }).bind(context));
}
READ ALSO
Пагинация своими руками

Пагинация своими руками

Всех с наступающимРебята подскажите как сделать в пагинации 5 шагов в лево

241
Проблема с data-id

Проблема с data-id

Суть в том, что data-id не соответствуетНе могу понять почему

247