$q.when
$q.when() can be used to wrap an object or function if we are not sure whether it returns a promise or not. If we wrap a value object or a value returned function, the value will be passed as a result argument to the next function. When we wrap a function, the when() method will ensure that the function is executed first before going to the next one.
Below are some code examples:
$q.when('aaa').then(function(result) { alert(result); })
var vm = this; vm.chars = ''; $q.when(_test()).then(function(){ vm.chars = vm.chars + 'END' }) _test = function() { for (i = 0; i <= 10000; i++) { vm.chars = vm.chars + '.' } }
$q.all
$q.all() is used to combine promise returned functions and only continue to progress further after all of the functions complete successfully. If one of the functions fails, immediately as soon as $q.all() gets a rejected promise from one of the functions, it will end the execution and pass forward to an error callback if there is any.
vm.numbers = ''; _promiseFunction = function(x) { var deferred = $q.defer(); if (x > 0) { deferred.resolve(x * 100); } else { deferred.reject(x + " is smaller than 0") } return deferred.promise; } var first = _promiseFunction(1); var second = _promiseFunction(5); var third = _promiseFunction(10); var four = _promiseFunction(-1); var five = _promiseFunction(-10) $q.all([first, second, third /*, four, five*/]). then(function(results){ console.log(results.length); for(i=0; i < results.length; i++) { vm.numbers = vm.numbers + ' ' + results[i]; } }, function(errors){ // if there is any error in the sequence, the success callback will not be called console.log(errors); })
$q.then
$q.then() is useful for executing asynchronous functions (or blocks of codes) sequentially in a chain. If the function inside a then() does not return a promise, it will be wrapped as a resolved promise. Otherwise the resolved or rejected promise will be passed forward.
_promiseFunction(5).then( function() { alert('aaa')} ).then( function() { alert('bbb');} ).then( function() {alert('ccc');} );
_promiseFunction(5).then( function() { return $q.reject('failed')} ).then( function(){ alert('result success')}, function(){ alert('result fail')} )
Note also that if we return a non-promise value in the error callback inside then(), this will be treated as a resolved promise. So we need to be careful when handling error if our intention is to pass the error forward to the next function.
$q.reject().then( // success function() {}, // error function(error) { return 'i got the error' } ).then( //success function() { alert('success'); }, // error function() { alert('error') } )
$q.reject
Last thing, we have $q.reject() that is useful as a quick way to create then send a rejected promise (with a value optionally) to the next function in a chain. For example, in a chain of multiple then(). We can see this in the last two examples.
See the examples in Plunker.