Измените цикл for для выполнения функций по одной строке за раз - PullRequest
3 голосов
/ 20 марта 2012

У меня есть функция, которая должна проходить через каждую строку таблицы, извлекать номер из этой ячейки, отправлять этот номер в URL, чтобы получить ответ json, а затем распечатать что-нибудь на основе этого. У меня почти все работает, но так как сейчас он просто выводит все это сразу, я хочу, чтобы он использовал что-то вроде .each, чтобы проходить через каждый ряд, делать свое дело и переходить к следующему. Я также работаю с jquery datatables. Сценарий таков:

$j('#imageCheck').click(function(){
    var cells = [];
    var rows = oTable.fnGetNodes();
    for( var i=0;i<rows.length;i++){
        grabsku = $j(rows[i]).find('td:eq(2)').text();
        imgreplace = $j(rows[i]).find('td:eq(2)');
        s7url = 'http://checkit.com/is/image/' + grabsku;       

        $j.ajax({
            type: 'GET',
            url: s7url,
            data: 'req=exists,json',
            dataType: 'jsonp',
            beforeSend:function(){
                imgreplace.html('checking ..');
            },
            success: function(){
                imgreplace.html(z);
            }
        });
    }
});

Ответ и все работает отлично, мой вопрос, как зациклить их один за другим. Как и в этом примере, imgreplace.html('checking ..'); происходит одновременно через каждую строку в таблице. Я хочу, чтобы он просто обработал эту строку и после success перешел к следующей.

Обновление

Чтобы лучше объяснить, почему я делаю это таким образом, я согласен, что это неестественно, данные, которые я собираю из каждой ячейки, помогают сформировать уникальный URL, s7url. Каждый из них возвращает ответ от сервера, который я не могу контролировать:

s7jsonResponse(
{"catalogRecord.exists":"0"},"");

Затем я делаю что-то, зная, истинно или ложно, как это:

function jsonResponse(response){    
    x = response["record.exists"];  
    z = x == "0" ? "NO" : "YES";
}

Мне нравится решение scrappedcola, но оно привело меня к тому, что успех никогда не был достигнут Я не уверен, почему это так. Я вижу на вкладке инспектора, что есть ответ, который я вставил выше. Я пытался перенести успех в его собственную функцию, что-то вроде:

success: function(){ success(); } 

...

var success = function(){
    imgreplace.html(z);
    i++;
    handleImageCheck(i);    
}

но это не помогло ..

Обновление 2

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

error: function(data, status){
        if (status = "parseerror") {
            imgreplace.html(z);
            i++;
            handleImageCheck(i);    
        }
    }

Обновление 3

Если по какой-то причине кому-то все равно, я нашел решение для другой моей проблемы success не стрельба. Мне нужно было добавить jsonpCallback к параметрам, а затем обработать ответ как функцию в succcess.

Ответы [ 2 ]

0 голосов
/ 20 марта 2012

Если вы хотите, вы должны использовать небольшую рекурсию

function makeCall(rows, index) {
    //if index is undefined, it's the first call, let's start from the first element
    if (index === undefined) {
        index = 0;
    }
    row = rows[index];
    grabsku = $j(row).find('td:eq(2)').text();
    imgreplace = $j(row).find('td:eq(2)');
    s7url = 'http://checkit.com/is/image/' + grabsku;

    $j.ajax({
        type: 'GET',
        url: s7url,
        data: 'req=exists,json',
        dataType: 'jsonp',
        beforeSend: function() {
            imgreplace.html('checking ..');
            var nextIndex = index + 1;
            //if there is anothe element in rows, make another call)
            if (rows[nextIndex] !== undefined) {
                makeCall(rows, nextIndex);
            }
        },
        success: function() {
            imgreplace.html(z);
        }
    });
}

       var rows = oTable.fnGetNodes();
       makeCall(rows);

Кстати - AJAX - это круто, потому что вы можете делать много звонков одновременно, ожидание, как будто это не кажется мне естественным!

0 голосов
/ 20 марта 2012

Нечто подобное может сработать для вас.По сути, вы должны сделать 1 вызов функции проверки изображения, которая выполняет асинхронный вызов.Затем при успешном выполнении асинхронного вызова перейдите к следующей строке.

var i;  
  $j('#imageCheck').click(function(){ 
     i = 0;
     handleImageCheck(i);
  })
  var handleImageCheck = function(i){
     var cells = [];
     var rows = oTable.fnGetNodes();
     if($j(rows[i]).length)
     {     
    grabsku = $j(rows[i]).find('td:eq(2)').text();
    imgreplace = $j(rows[i]).find('td:eq(2)');
    s7url = 'http://checkit.com/is/image/' + grabsku;       

    $j.ajax({
      type: 'GET',
       url: s7url,
       data: 'req=exists,json',
       dataType: 'jsonp',
       beforeSend:function(){
          imgreplace.html('checking ..');
       },
       success: function(){
          imgreplace.html(z);
          i++;
          handleImageCheck(i);
       }
     });
    }
  }
...