你的位置:首页 > Java教程

[Java教程]angular $q服务


CommonJS Promise标准

Promise分为两个部分

  • Deferred

  • Promise

Deferred用于作为通信对象,分为三个状态:开始,处理和结束.

Promise是Deferred响应数据的输出,同样拥有等待,执行和拒绝以及相应的回调函数.

 

$q

angular中能够帮你异步运行function的一项服务,当它们的处理线程完毕后,可以使用它们的返回值.

最新的ES6 style promise 本质上就是使用$q作为一个构造器(resolve function做为第一个参数).

  • $q.defer()

  • $q.when()    ----用于通过一个变量创建一个promise

  • $q.all()

 1 var defer = $q.defer(); 2  3 var promise = defer.promise; 4  5 promise.then(function (val) { 6  7 console.log(val); 8  9 var a = "1";10 11 return $q.when(a);12 13 }).then(function (someThing) {14 15 console.log(someThing);16 17 });18 19 $timeout(function () {20 21 defer.resolve("success");22 23 }, 1000);24 25 // 这只是个简单的例子,说明可将将普通对象当做promise对象处理

 

 


Deferred API

通过调用$q.defer()来创建一个deferred对象.

deferred对象的目的是显示关联的Promise实例和API,用来发送成功和失败完成的信号和任务完成的情况.

 

Methods

  • resolve(val)

  • reject(reason)

  • notify(value)

Properties

  • promise    ----用于接收deferred的工作状态通知.并通过调用处理函数对状态处理.

 

Promise API

当一个deferred对象创建好之后,一个新的Promise对象实例就会被创建,可以通过deferred.promise得到.

promise对象的目的是允许获取deferred执行完成之后的结果.

 

Methods

  • then(successCallBack, errorCallBack, notifyCallBack)

  • catch(errorCallBack)    ----可以使用catch捕获deferred.reject(reason),与then中的errorCallBack功能一致.

  • finally(callBack, notifyCallBack)

 1 var defer = $q.defer(); 2  3 var promise = defer.promise; 4  5 promise.then(function (val) { 6  7 console.log(val); 8  9 }).catch(function (msg) {10 11 console.error(msg);12 13 });14 15 $timeout(function () {16 17 defer.reject("error");18 19 }, 1000);

 

 


Promise链

通过调用then方法,promise可以返回一个新派生的promise对象,用于接下来的then()使用.

 1    var defer = $q.defer(); 2  3    var promise = defer.promise; 4  5    promise.then(function (val) { 6  7       console.log(val); 8  9      var innerDeferred = $q.defer();10 11      innerDeferred.resolve("inner");12 13      return innerDeferred.promise;14 15    }).then(function (msg) {16 17       console.log(msg);18 19     });20 21    $timeout(function () {22 23      defer.resolve("success");24 25    }, 1000);

 

注:如果在then的回调函数中不返回一个新的promise对象或其它对象,则默认为返回undefined.

 

大家有什么疑问可留言提问,刚接触angular一个多月,开发过程中实时补充相关知识,有什么纰漏大神可以指出,希望共同进步.