$q是Angular的一种内置服务,它可使你异步地执行函数,而且当函数执行完成时它容许你使用函数的返回值(或异常)。promise
defer的字面意思是延迟,$q.defer() 能够建立一个deferred实例(延迟对象实例)。异步
deferred 实例旨在暴露派生的Promise 实例,以及被用来做为成功完成或未成功完成的信号API,以及当前任务的状态。这听起来好复杂的样子,总结$q, defer, promise三者之间的关系以下所示。async
var deferred = $q.defer(); //经过$q服务注册一个延迟对象 deferred var promise = deferred.promise; //经过deferred延迟对象,能够获得一个承诺promise,而promise会返回当前任务的完成结果
defer的方法:ide
1. deferred.resolve(value) 成功解决(resolve)了其派生的promise。参数value未来会被用做promise.then(successCallback(value){...}, errorCallback(reason){...}, notifyCallback(notify){...})中successCallback函数的参数。函数
2. deferred.reject(reason) 未成功解决其派生的promise。参数reason被用来讲明未成功的缘由。此时deferred实例的promise对象将会捕获一个任务未成功执行的错误,promise.catch(errorCallback(reason){...})。补充一点,promise.catch(errorCallback)实际上就是promise.then(null, errorCallback)的简写。spa
3. notify(value) 更新promise的执行状态(翻译的很差,原话是provides updates on the status of the promise's execution)翻译
defer的小例子: rest
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); });
当建立一个deferred实例时,promise实例也会被建立。经过deferred.promise就能够检索到deferred派生的promise。code
promise的目的是容许interested parties 访问deferred任务完成的结果。对象
按照CommonJS的约定,promise是一个与对象交互的接口,表示一个动做(action)的结果是异步的,并且在任何给定的时间点上可能或不可能完成。(这句话好绕口,个人理解是promise至关于一个承诺,承诺你这个任务在给定的时间点上可能会完成,也可能完成不了。若是完成了那就至关于resolve, 若是未完成就至关于reject。不知道这样理解对不对?)
promise 的方法:
1. then(successCallback, errorCallback, nitifyCallback) 根据promise被resolve/reject,或将要被resolve/reject,调用successCallback/errorCallback。
2. catch(errorCallback) then(null, errorCallback)的缩写。
3. finally(callback, notifyCallback)
补充说明:
promise.then()会返回一个新的衍生promise,造成promise链。例如:
promiseB = promiseA.then(function(result) { return result + 1; }); // promiseB will be resolved immediately after promiseA is resolved and its value // will be the result of promiseA incremented by 1