• 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
  • 相关阅读:
    【BZOJ1023】仙人掌图(SHOI2008)-圆方树+DP+单调队列
    【BZOJ4816】数字表格(SDOI2017)-莫比乌斯反演+数论分块
    【BZOJ3529】数表(SDOI2014)-莫比乌斯反演+树状数组
    【BZOJ3714】Kuglarz(PA2014)-最小生成树
    javascript div元素后追加节点
    php多文本框提交
    有几数组表单,js怎么获得数组并动态相加输出到文本框
    SqlCommand.Parameters.add()方法
    ASP.net后台弹出消息对话框的方法!【转】
    Access中的SELECT @@IDENTITY
  • 原文地址:https://www.cnblogs.com/wjw-blog/p/6136813.html
Copyright © 2020-2023  润新知