2013-06-20 2 views
1

У меня есть несколько вызовов ajax, и когда они преуспевают, мне нужно, во-первых, сделать одну и ту же проверку для всех ответов, а затем, если проверка не подводит, делать разные вещи с ответами.

На данный момент я использую success вариант в каждом из вызовов и вставить эту проверку в каждом из вызовов, как это:

$.ajax({ 
    success: function (data){ 
     if (response_has_errors(data)) 
      {return} 
     // do stuff 
    } 
}); 

Итак, у меня есть идея: использовать $(document).ajaxSucces() для делаете а затем использовать $.ajax().done() или success с каждым из вызовов.

Но мне нужно, чтобы обработчик в $(document).ajaxSucces() всегда выполнялся первым, и если он возвращает false, не выполнять отдельные обработчики. Как мне это сделать?

ответ

1

Прежде всего, вы должны убедиться, что сервер не возвращает статус успеха (200 OK), когда ответ на самом деле является ошибкой. Это экономит вас на одном этапе обработки.

Затем вы можете использовать jQuery's when() для обработки запросов вместе.

$.when(
    $.ajax(...), $.ajax(...), $.ajax(...), $.ajax(...) 
) 
.then(function() (result1, result2, result3, result4) { 
    // all requests have successfully returned 
}) 
.fail(function() { 
    // handle error (inspect arguments) 
}) 
.always(function() { 
    // stop throbbers or other clean up work if necessary 
}); 

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

Обратите внимание, что вы также можете передать массив jQuery XHRs, используя apply().

$.when.apply($, allReqests).then(/* ... */); 
+0

К сожалению, я не влияю на то, что сервер возвращает. Кроме того, я не совсем понимаю, в вашем решении, как я * сначала * делаю одну и ту же проверку, а затем * обрабатываю ответы отдельно? – protasovams

+1

@protasovams Если вы не можете изменить код ответа сервера, вы можете (и должны) по-прежнему использовать [jQuery's * Deferred * architecture] (http://api.jquery.com/category/deferred-object/). Вот пример, который может прояснить некоторые вещи. http://jsfiddle.net/XTVxt/ – Tomalak

+0

Ничего себе, огромное спасибо за прекрасный пример, он все прояснил. – protasovams

1

Я мог бы предложить использовать «dataFilter» от $ .ajax(): http://api.jquery.com/jQuery.ajax/

Вы можете поместить некоторые обработки ошибок в этом dataFilter, и если она не - обновить некоторые флаг непосредственно в данных, и есть все обработчики «успеха» проверяют этот флаг перед выполнением.

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