Вопрос: Последовательность выполнения отложенного ответа jQuery


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


14


источник


Ответы:


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

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

Детали реализации

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

Вот стек вызовов для добавления обратных вызовов к объекту «Отложен»:

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


11



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

См. Следующие Пример jsfiddle ,

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


4