2012-01-05 3 views
1

У меня есть следующие действия:JQuery обратного вызова на функцию

$('.sub_outworker').live('click', function() { 

       var input = $(this); 
       var current_div = input.parents('div.report'); 
       var current_div_id = current_div.attr('id'); 
       var replace_div = current_div.children('div').first(); 
       var submission = submit_form(input, replace_div); 
       var i = 0; 
} 

В submit_form() функция выглядит следующим образом:

function submit_form(input, replace_div) { 
      var form = input.parents('form'); 

      loading_gif(replace_div); 

      $.ajax({ 
       type: 'POST', 
       url: form.attr('action'), 
       data: 'ajax=true&' + form.serialize(), 
       success: function(data) { 
        get_json(); 

        if(data == 'success') { 
         return 'success'; 
        } 
        else { 
         return 'failed'; 
        } 
       } 
      }); 
     } 

Я хочу проверить == ли представление не удалось, и, если он мчит submit_form снова (т. е. дать функции второй шанс работать - главным образом потому, что она изредка терпит неудачу при проверке из-за несоответствия в токенах). Я не уверен, как это сделать!

+2

Вы не можете вернуть какое-либо значение из обратного вызова 'success'. –

+0

'submit_form' ничего не возвращает. –

+0

Это, вероятно, объясняет, почему я не мог заставить свои попытки работать раньше! –

ответ

2

Если вы просто хотите, чтобы запустить его еще раз, самый простой (и IMO надёжным) способом может быть использование deferred objects [docs]:

function submit_form(input, replace_div) { 
    var deferred = new $.Deferred(); 
    var form = input.parents('form'); 

    loading_gif(replace_div); 

    $.ajax({ 
     type: 'POST', 
     url: form.attr('action'), 
     data: 'ajax=true&' + form.serialize(), 
     success: function(data) { 
      get_json(); 

      if(data == 'success') { 
       deferred.resolve(data); 
      } 
      else { 
       deferred.reject(data); 
      } 
     } 
    }); 

    return deferred; 
} 

Тогда вы можете сделать:

var request = submit_form(input, replace_div); 
request.fail(function() { 
    submit_form(input, replace_div); 
}).done(function() { 
    // request was successful, do something 
}); 

Отложенные объекты обеспечивают большую гибкость при асинхронных вызовах и позволяют легко развязывать код. Конечно, если вы хотите повторить попытку сделать вызов Ajax «функцией» функции submit_form или если вы хотите повторить его более одного раза, то @Matt's answer представляется лучшим способом.

+0

Работаю как мечта Феликс, спасибо! –

2

Это должно быть сделано в обратном вызове $.ajax().

$('.sub_outworker').live('click', function() { 

    var input = $(this); 
    var current_div = input.parents('div.report'); 
    var current_div_id = current_div.attr('id'); 
    var replace_div = current_div.children('div').first(); 
    submit_form(input, replace_div); 
} 

function submit_form(input, replace_div) { 
    var form = input.parents('form'); 

    loading_gif(replace_div); 

    $.ajax({ 
     type: 'POST', 
     url: form.attr('action'), 
     data: 'ajax=true&' + form.serialize(), 
     success: function(data) { 
      get_json(); 

      if(data == 'success') { 
       submit_form.failCount = 0; 
      } 
      else if (!submit_form.failCount) { 
       submit_form.failCount++; 
       submit_form(input, replace_div); 
      } 
     } 
    }); 
} 
+1

Также может быть интересно использовать отложенные объекты, чтобы быть более гибкими, но это простое решение, которое работает. +1 :) –

+0

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

+1

Было бы хорошо видеть решение отложенных объектов Felix –

0

Не могли бы вы сделать что-то вроде этого? Обратите внимание: я не уверен на 100%, что вы ожидаете получить с сервера, или точно, как структурирована ваша страница.

function submit_form_ajax(serializedData, numAttempts) { 

    numAttempts--; 

    $.ajax({ 
     type: 'POST', 
     url: form.attr('action'), 
     data: 'ajax=true&' + serializedData, 
     success: function(data) { 
      get_json(); 

      if(data !== 'success') { 
       if(numAttempts >= 1) { 
        submit_form_ajax(serializedData, numAttempts-1); 
       } 
      } 
     } 
    }); 

} 

function submit_form(input, replace_div) { 
    var form = input.parents('form'); 

    loading_gif(replace_div); 

    submit_form_ajax(form.serialize(), 2); 
} 
Смежные вопросы