Difference between $q.when and $q.defer in angularJS
Asked Answered
T

2

7

I am seeing angularJS files where in some places reviewer has commented these 3 lines:

var deferred = $q.defer();
deferred.resolve(BrandList);
return deferred.promise;

and replaced with this one:

return $q.when(BrandList);

I would like to understand the difference between two. Do both serve same purpose? Which should be used when?

Tong answered 6/7, 2015 at 17:6 Comment(3)
Yes, they do the same. But only the second conveys the intent (and it's shorter as well).Ropy
So can we use either of two at any point of time in our code??Tong
Well, $q.when is a single function, and could be passed around. A call to it makes a single expression that can be used about everywhere, while the first snippet with $q.defer() contains multiple statements.Ropy
S
4

Ben Nadal does a great job of explaining this here.

In his words:

The $q.when() method doesn't just create a promise that is immediately resolved; rather, it normalizes a value that may or may not be a "thenable" object. If the given value is a promise, $q.when() will properly chain off of it. If the given value is not a promise, $q.when() will create promise resolved with the given value.

So essentially it takes either promises or non-promises and does some magic to make sure they are either resolved or promise wrapped so as not to break the promise chain.

Slue answered 6/7, 2015 at 17:12 Comment(0)
S
1

$q.defer() is appropriate when you want to decorate a function to use promises instead of callbacks. Usually, you will specify a deferred.resolve() and a deferred.reject(), and maybe even a deferred.notify().

$q.when() is appropriate when you want to immediately create a new promise and resolve it to a value. EDIT it also normalizes variables into promises, which is useful if the variable may or may not be a promise. See Jim's answer.

$q.when() seems to be appropriate for your case.

Sensate answered 6/7, 2015 at 17:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.