Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Difference between $q.when and $q.defer in angularJS

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?

like image 1000
Devesh Agrawal Avatar asked Jul 06 '15 17:07

Devesh Agrawal


2 Answers

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.

like image 66
JimTheDev Avatar answered Sep 20 '22 23:09

JimTheDev


$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.

like image 43
Daniel Weiner Avatar answered Sep 21 '22 23:09

Daniel Weiner