2011-12-13 7 views
2

Deferred Объекты имеют два основных пула обратных вызовов, а именно: doneCallbacks и failCallbacks. Оба пула являются «линейными»: обратные вызовы сохраняются один за другим в том порядке, в котором они были указаны.Обработка ошибок с использованием `Deferred`

Эта линейная структура, похоже, противоречит «древовидной» структуре, которую приходится учитывать при обработке ошибок. На каждом шагу есть два случая: сбой и пропуск.

if(err) { 
    // stuff 
    if(err) { 
      // stuff 
    } else { 
      // stuff 
    } 
else { 
    // stuff 
    if(err) { 
      // stuff 
    } else { 
      // stuff 
    } 
} 

кажется, что из-за наложенного линейности Deferred с, они не очень подходят для обработки ошибок. Я что-то пропускаю?

+0

Что вы пытаетесь достичь? –

ответ

5

Это немного многословное, но это из документации JQuery для $.when():

В случае, когда несколько отложенных объекты передаются в jQuery.when, метод возвращает Promise от нового «хозяина» Отложенный объект , который отслеживает состояние совокупности всех отложенных сообщений . Метод разрешит его хозяина Отложенное, как только все отклонения разрешат или отклоняют мастера Отсрочить, как только одна из Отложенных будет отклонена. Если хозяин Deferred разрешен, то передал разрешенные значения всех Отложенных, которые были переданы в jQuery.when. Например, когда аргументы «Отсрочки» представляют собой jQuery.ajax() , аргументы будут объектами jqXHR для запросов, в порядке, указанном в списке аргументов.

В случае множественного-Deferreds, где один из Deferreds отвергается, jQuery.when немедленно увольняет failCallbacks для своего хозяина Отложенный. Обратите внимание, что некоторые из Отложенных могут оставаться неразрешенными на . Если вам необходимо выполнить дополнительную обработку для этого случая , например, отменить любые незавершенные запросы ajax, вы можете сохранить ссылки на основные объекты jqXHR в закрытии и проверить/отменить их в failCallback.

Источник: http://api.jquery.com/jquery.when/

Таким образом, если объект deferred решает ошибки то master deferred пожары failCallbacks, и это до вас, чтобы решить, что делать с, возможно, не-решенных deferred с.