A basic example of using $q:
function myAsyncFunc() { // create a deferred object var deferredObject = $q.defer(); . . . // if for a reason, we want to cancel this task if (errorOccured) { deferredObject.reject('an error has occured'); return deferredObject.promise; } // after the job is completed, call resolve() deferredObject.resolve(); . . . // return the promise return deferredObject.promise; } // then on the caller myAsyncFunc().then( // success (when resolve() was called) function() { alert('success') }, // error (when reject() was called) function(reason) { alert('failed: ' + reason) } )
We can also return an object when the task is completed. To do this, just pass the object as an argument to the resolve() function instead of nothing. Below is an example:
function myAsyncFunc() { var myObject = . . . deferredObject.resolve(myObject); } // then on the caller, we can use the passed object myAsyncFunc().then( // success function(passedObj) { . . . } );
When resolving a deferred object, we can use deep nesting functions if required. As long as the deferred object variable is accessible, this should not be an issue:
var deferredObject; // need to make sure that this deferred object variable will be accessible from inside nesting function function myAsyncFunc() { // create a deferred object deferredObject = $q.defer(); . . . nestedOne(); // return the promise return deferredObject.promise; } function nestedOne() { nestedTwo(); } function nestedTwo() { deferredObject.resolve(); }
No comments:
Post a Comment