Как работает Angular $ q.when?


95

Может кто-нибудь объяснить мне, как $q.whenработает AngularJS? Пытаюсь проанализировать как $httpработают и обнаружил вот что:

var promise = $q.when(config);

А вот и объект конфигурации из консоли Chrome:

Object {transformRequest: Array[1], transformResponse: Array[1], cache: Object, method: "GET", url: "/schedule/month_index.html"…}
cache: Object
headers: Object
method: "GET"
transformRequest: Array[1]
transformResponse: Array[1]
url: "/schedule/month_index.html"
__proto__: Object

Что происходит дальше? Как этот объект разрешается или отклоняется?


$ q реализует шаблоны обещаний - это просто простая оболочка для обратных вызовов в javascript. Поэтому, когда обратный вызов успешно запущен, обещания разрешаются
Аджай Бенивал

1
@Ajaybeniwal, но в этом случае объект передан, а не обратный вызов. Как это разрешено / отклонено в случае, когда объект передан, а не обратный вызов?
SET

Ответы:


113

Вызов $q.whenпринимает обещание или любой другой тип, если это не обещание, он оборачивает его в обещание и вызывает разрешение. Если вы передадите ему значение, оно никогда не будет отклонено.

Из документов:

Оборачивает объект, который может быть значением или (сторонним) тогда возможным обещанием, в обещание $ q. Это полезно, когда вы имеете дело с объектом, который может быть или не быть обещанием, или если обещание исходит из источника, которому нельзя доверять.


If you pass a value to it- а что, если я прохожу мимо объекта?
SET

11
значение, объект, массив - все равно.
Derek Ekins

3
что, если я передам функцию, возвращающую обещание? Означает ли это, что тогда обратному вызову будет передан параметр результата обещания, отправленный с помощью разрешения?
Онур Топал

3
Онур, когда вы говорите передать функцию, вы имеете в виду как объект функции:, $q.when(myfunc)или вызывая функцию, которую вы передаете $q.when(myfunc()):? Я точно не знаю, что будет делать myfunc()первый ... второй вызовет первым и передаст возвращенное обещание | значение .when().
jrista
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.