AnjularJS异步编程 Promise和$q

Promise,是一种异步处理模式。

js代码的函数嵌套会使得程序执行异步代码时很难调试。因为多重嵌套的函数无法确定何时触发回调。

如:

funA(arg1,arg2,function(){
    funcB(arg1,arg2,function(){
        funcC(arg1,arg2,function(){
             xxxx....
        })
    })   
})

如果用Promise这种规范,就使得代码很容易理解。它能帮助开发者以同步的方式编写异步的代码。如

deferABC.resolve(xxx)
.then(funcSuccess(){}
    ,funcError(){}
    ,funcNotify(){}
);

当resolve内的对象执行成功,就会触发 funcSuccess,如果失败就触发funcError.有点类似这样一种服务:

deferABC.resolve(function(){
    Sunccess:funcSuccess,
    error:funcError,
    notify:funcNotify
})

Promise就是一种对执行结果不确定的一种预先定义。如果成功就执行一套success的处理过程,如果失败,就执行一套error的处理过程,无论成功或失败,都记得通知我执行结果。这样就保证无论成功失败,至少会给出resolve一个明确的答复。

引用网上很经典的例子:

比如,小白在上学时很懒,平时总让舍友带饭,并且事先跟他说好了,如果有韭菜鸡蛋就买这个菜,否则就买西红柿炒鸡蛋;无论买到买不到都要记得带包烟。

小白让舍友带饭()
.then(韭菜鸡蛋,西红柿炒鸡蛋)
.finally(带包烟)

大致理解了Promise(承诺)这种模式。再理解AnjularJS的$q服务就容易的多了。

q服务是AngularJS中自己封装实现的一种Promise实现。

$q的常用方法:

  • defer() 创建一个deferred对象,这个对象可以执行几个常用的方法,比如resolve,reject,notify等
  • all() 传入Promise的数组,批量执行,返回一个promise对象
  • when() 传入一个不确定的参数,如果符合Promise标准,就返回一个promise对象。

在Promise中,定义了三种状态:等待状态,完成状态,拒绝状态。

关于状态有几个规定:
1 状态的变更是不可逆的
2 等待状态可以变成完成或者拒绝

defer()方法:

其中defer()用于创建一个deferred对象,defer.promise用于返回一个promise对象,来定义then方法。then中有三个参数,分别是成功回调、失败回调、状态变更回调。

all()方法:

这个all()方法,可以把多个primise的数组合并成一个。当所有的promise执行成功后,会执行后面的回调。回调中的参数,是每个promise执行的结果。
当批量的执行某些方法时,就可以使用这个方法。

var funcA = function(){
                console.log("funcA");
                return "hello,funA";
            }
            var funcB = function(){
                console.log("funcB");
                return "hello,funB";
            }
            $q.all([funcA(),funcB()])
            .then(function(result){
                console.log(result);
            });

执行结果:

funcA
funcB
Array [ "hello,funA", "hello,funB" ] 

when()方法:

when方法中可以传入一个参数,这个参数可能是一个值,可能是一个符合promise标准的外部对象。 

var funcA = function(){
                console.log("funcA");
                return "hello,funA";
            }
            $q.when(funcA())
            .then(function(result){
                console.log(result);
            });

执行结果:

hello,funA

 

posted @ 2016-12-06 11:08  wjwdive  阅读(218)  评论(0编辑  收藏  举报