jQuery Отложенное/обещание имеет два результата: разрешено и отклонено. Вы можете присоединить обратные вызовы к отложенному, которые связаны с любым состоянием. Выполняются условия для вложения (связанные с разрешенными), fail (связанные с отклоненными) и всегда (связанные с обоими состояниями). Я безуспешно пытался определить последовательность обратных вызовов, когда состояние переходит из ожидающего ожидания в незавершенное; то есть для выполненных и всегда (или сбой и всегда), какова последовательность, в которой обратные вызовы выполняются для каждого состояния разрешенных и отклоненных?
JQuery Отложенная последовательность выполнения обратного вызова
Ответ 1
Ответ на@Malcolm действительно правильный. Документы упоминают его во многих местах, в том числе:
-
deferred.done()
иdeferred.fail()
- " Обратные вызовы выполняются в том порядке, в котором они были добавлены. -
deferred.always()
- "Когда Deferred разрешено или отклонено, обратные вызовы выполняются в том порядке, в котором они были добавлены" -
jQuery.ajax()
- "Promise callbacks -.done()
,.fail()
,.always()
и.then()
- вызывается, в том порядке, в котором они зарегистрированы".
Сведения о реализации
Глядя на Отложенный модуль, он использует Модуль обратных вызовов, который реализует список обратных вызовов FIFO.
Здесь стек вызовов для добавления обратных вызовов к объекту "Отложенный":
-
always()
-
done()
/fail()
-
Callbacks.add()
-
list.push()
- функция обратного вызова нажата в конец списка.
-
-
-
И здесь стек вызовов для разрешения/отклонения объекта Отложенное:
-
resolve()
/reject()
-
resolveWith()
/rejectWith()
-
Callbacks.fireWith()
-
Callbacks.fire()
- Обратные вызовы в списке выполняются в порядке FIFO, используя afor
.
-
-
-
Ответ 2
Отложенные объекты обрабатывают свои обратные вызовы в порядке, когда обратный вызов был добавлен к отложенному объекту. Нет приоритета done()
над always()
, или наоборот. Поведение идентично, вызываете ли вы resolved()
или reject()
.
См. следующий пример jsfiddle.
Комментарии по оригинальному вопросу неверны или, по крайней мере, не совсем корректны.