angular的$q服务以及js的promise编程

来源:互联网 发布:谷歌数据分析师 编辑:程序博客网 时间:2024/05/21 08:50

JS;promise编程主要是优雅的代码风格,当业务逻辑极其复杂,而且函数之间的回调函数增多可以考虑promise编程::



  JS的回调promise编程,上代码:

   JS  promise编程    //假设第一个请求::    var http1=new Promise(function(resolve,reject){        resolve("data1");    }) ;    var http2=new Promise(function(resolve,reject){        resolve("data2");    });    var http3=new Promise(function(resolve,reject){        resolve("data3");    });    http1.then(function(data){        alert(data);        //继续开始请求2发起        return http2;    }).then(function(data){        alert(data);        return http3;    }).then(function(data){        alert(data);    });
此时最主要的就是:resolve和promise::

              resolve主要是存储上一个函数的值存放位置::


      promise:根据返回的promise:决定调用哪一个回调函数,可以一直链式编程下去::

 angularjs中的promise编程:取决于$q这个指令。

   直接返回$http说读不到数据,原因在于$http是异步请求,而且是“不可期”的,你不知道什么时候这个请求完成了。

而对于这种需要“同步”编程的方式,AngularJS提供了一个内置Service $q,它提供了一种承诺/延后(promise/deferred),可以保证我们的调用代码一定能够拿到数据。所以我们用起来可以像同步调用一样,话说回来,最终还是xhr异步请求。


           在这种请求当中多个请求为了让其产生近似同步的概念:所以开始promise编程:



主要关键:$q.defer()获取defer对象存储$http请求的数据::根据请求结束返回promise对象,通过defer.promise


                  继续每一个请求完成返回promise:后开始执行下面的promise程序::

<pre name="code" class="html">$scope.loadCustomInfo=function(){        //保存数据信息resolve(value):向promise对象异步执行体发送消息告诉他我已经成功完成任务,value即为发送的消息。        var loadCustomdefer=  $q.defer();        //存放数据        var params = {};        //根据保单号查询当前步数        params.slip_id =$rootScope.insurancecode;        $http({ method: "POST",            headers: {'Content-Type': 'application/x-www-form-urlencoded'},            url: $scope.address["loadcustominfo"],            //查询步数            data: params,            dataType: "json"}).success(function(data){              //保存数据            loadCustomdefer.resolve(data);//声明执行成功        }).error(function(data){            loadCustomdefer.reject(); //声明执行失败            $scope.alertModal("网络请求失败");        })             return  loadCustomdefer.promise;    };


var loadCustomInfopromise= $scope.loadCustomInfo();请求完成返回promise对象

第一个promise开始进行链式请求

  initsteppromise.then(function(data){            //真正的数据:            console.log("投保序列号1");            console.log(data);            return loadCustomInfopromise;        },function(error){}).then(function(data){            //第一次请求的数据:            console.log("投保序列号2");            console.log(data);            // return loadSlipSnInfopromise;        }


    这样解决了数据不同步问题:angularjs $q promise编程

    











  

0 0
原创粉丝点击