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一个多月,开发过程中实时补充相关知识,有什么纰漏大神可以指出,希望共同进步.

posted @ 2015-10-29 13:24  DemoZhang  阅读(1474)  评论(0编辑  收藏  举报