JQuery Отложенная последовательность выполнения обратного вызова

jQuery Отложенное/обещание имеет два результата: разрешено и отклонено. Вы можете присоединить обратные вызовы к отложенному, которые связаны с любым состоянием. Выполняются условия для вложения (связанные с разрешенными), fail (связанные с отклоненными) и всегда (связанные с обоими состояниями). Я безуспешно пытался определить последовательность обратных вызовов, когда состояние переходит из ожидающего ожидания в незавершенное; то есть для выполненных и всегда (или сбой и всегда), какова последовательность, в которой обратные вызовы выполняются для каждого состояния разрешенных и отклоненных?

Ответ 1

Ответ на

@Malcolm действительно правильный. Документы упоминают его во многих местах, в том числе:

  • deferred.done() и deferred.fail() - " Обратные вызовы выполняются в том порядке, в котором они были добавлены.
  • deferred.always() - "Когда Deferred разрешено или отклонено, обратные вызовы выполняются в том порядке, в котором они были добавлены"
  • jQuery.ajax() - "Promise callbacks - .done(), .fail(), .always() и .then() - вызывается, в том порядке, в котором они зарегистрированы".

Сведения о реализации

Глядя на Отложенный модуль, он использует Модуль обратных вызовов, который реализует список обратных вызовов FIFO.

Здесь стек вызовов для добавления обратных вызовов к объекту "Отложенный":

И здесь стек вызовов для разрешения/отклонения объекта Отложенное:

Ответ 2

Отложенные объекты обрабатывают свои обратные вызовы в порядке, когда обратный вызов был добавлен к отложенному объекту. Нет приоритета done() над always(), или наоборот. Поведение идентично, вызываете ли вы resolved() или reject().

См. следующий пример jsfiddle.

Комментарии по оригинальному вопросу неверны или, по крайней мере, не совсем корректны.