$q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常)。
官网:http://docs.angularjs.cn/api/ng/service/$q
defer是延迟的意思, $q.defer()可以创建一个deferred实例(延迟对象实例)。
var defer=$q.defer();
defer有三个方法:resolve,reject,notify,一个属性:promise
function asyncGreet(name) { var deferred = $q.defer(); //通过$q.defer()创建一个deferred延迟对象,在创建一个deferred实例时,也会创建出来一个派生的promise对象,使用deferred.promise就可以检索到派生的promise。 deferred.notify('About to greet ' + name + '.'); //延迟对象的notify方法。 if (okToGreet(name)) { deferred.resolve('Hello, ' + name + '!'); //任务被成功执行 } else { deferred.reject('Greeting ' + name + ' is not allowed.'); //任务未被成功执行 } return deferred.promise; //返回deferred实例的promise对象 }
promise 对象的目的是在 deferred 任务完成时,允许感兴趣的部分取得其执行结果。
function asyncGreet(name) { var deferred = $q.defer(); //通过$q.defer()创建一个deferred延迟对象,在创建一个deferred实例时,也会创建出来一个派生的promise对象,使用deferred.promise就可以检索到派生的promise。 deferred.notify('About to greet ' + name + '.'); //延迟对象的notify方法。 if (okToGreet(name)) { deferred.resolve('Hello, ' + name + '!'); //任务被成功执行 } else { deferred.reject('Greeting ' + name + ' is not allowed.'); //任务未被成功执行 } return deferred.promise; //返回deferred实例的promise对象 } function okToGreet(name) { //只是mock数据,实际情况将根据相关业务实现代码 if(name == 'Superman') return true; else return false; } var promise = asyncGreet('Superman'); //获得promise对象 //promise对象的then函数会获得当前任务也就是当前deferred延迟实例的执行状态。它的三个回调函数分别会在resolve(), reject() 和notify()时被执行 promise.then(function(greeting) { alert('Success: ' + greeting); }, function(reason) { alert('Failed: ' + reason); }, function(update) { alert('Got notification: ' + update); });
可参考:
http://www.tuicool.com/articles/FfaA7bu
http://blog.csdn.net/renfufei/article/details/19174015
http://blog.csdn.net/lglgsy456/article/details/32335127
http://docs.angularjs.cn/api/ng/service/$q