AngularJs $q promise

angularjs提供的$q服务是对Promises规范的一个实现。$q服务可以把一段异步的代码封装成同步的样式。 为啥是样式,因为异步还是异步,它并不会柱塞代码,只是看起来像同步代码。 $q.when('abc').then().then(); 下面的代码演示了$q的构造函数的使用方法。$q的构造函数接受一个function(resolve,reject)的函数,resolve是成功的回掉,reject是失败的回掉。 通常Ajax请求都是异步的,通过success,failed回掉来处理结果。通过$q服务我们可以把这个ajax请求改写成promise的形式。 当然这个接口是我通过$timeout服务模拟了一个2s回复的ajax请求。

html:

<!DOCTYPE html>
<html>
    <head>
          <meta charset="UTF-8">
    </head>
    <body ng-app="app" ng-controller="ctrl" >
        <style>
            .valid-error{
                color:red
            }
        </style>
        <form name="form" novalidate>
             <input type="text" ng-model="id">
             <input type="button" value="Test" ng-click='doTest()'>
        </form>
    </body>
    <script src="bower_components/angular/angular.js">
    </script>
<html>

javascript:

        var app = angular.module('app',[]);
        app.factory('dataService',function($timeout){
            var service={};
            service.persons=[{id:1,name:'Jim'},{id:2,name:'Tom'},{id:3,name:'Agile'}];
            service.getName=function(id,callback,errorCallback){
                $timeout(function(){
                    for(var i in service.persons){
                        var person = service.persons[i];
                        if(person.id==id){
                            callback(person.name);
                            return;
                        }
                    }
                    errorCallback('can not find person by id: '+id);
                },2000);
            };

            return service;
        });
        
        app.controller('ctrl',function($scope,$q,dataService){
            $scope.id='';

            function getName(id){
              return $q(function(r,j){
                  dataService.getName(id,function(data){
                      r(data);
                  },function(data){
                      j(data);
                  });
              });
            };

            $scope.doTest=function(){
               var id = $scope.id;
               getName(id).then(function(data){
                   alert('Name is '+data);
               },function(data){
                   alert('failed: '+data);
               });
            }

            console.log('done');

            
        });

then方法接受2个function作为参数,第一个是resolve,第二个是reject。其实把ajax请求改写成promise并不能体现$q的威力。 改写后代码跟原来的代码没有太大的差别。

no promise:
getName(id,function(){},function());
promise:
getName(id).then(function(){},function(){});

promise形式只是把2个回掉提到了then方法里,只是看起来更同步了一点而已。 其实$http服务本身就是通过$q来实现的promise,所以当你使用$q来做ajax的时候已经非常promise了。

$q最大的好处我觉得在于$q.all方法,它可以等待多个promise完成之后在执行相应的代码,下回分享。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏nummy

sphinx入门指南【1】快速入门

包含.rst文件的根目录称之为源文件目录,目录中还包含sphinx的配置文件conf.py。

1724
来自专栏CDN常见问题

CDN 预热失败分析

CDN预热即是模拟用户发起请求到CDN,如果没有缓存,则回源拉取,如果有缓存是直接命中不会刷新也不会进行回源。

3515
来自专栏Python攻城狮

Python操作redis

1 .用户登录首先判断是否在redis缓存中,如果在redis缓存中,直接登录成功; 2 .若用户未在redis缓存,则访问Mysql,判...

2183
来自专栏程序员同行者

mysql命令行修改字符编码

1772
来自专栏python3

linux批量kill进程

ps -ef|grep orderMatcherSend.php |grep -v grep|cut -c 9-15|xargs kill -9

992
来自专栏拂晓风起

Flash builder打包as actionscript代码,发布swc

1384
来自专栏自由而无用的灵魂的碎碎念

解决source insight 3.5遇到的parse too comples错误

我使用source insight 编写c,编写代码的时候,source insight的symbol windows可能会提示parse too comple...

1282
来自专栏Android随笔

mac学习笔记

在打开的文本文件中,添加如下内容(/XXX/XXX/platform-tools/为你的adb路径)

822
来自专栏逍遥剑客的游戏开发

Tiled源码分析(四): 插件机制

2357
来自专栏码洞

自己动手实现 Shell多进程套套符

一篇技术文章如今仅仅是理论上讲得天花乱坠,却不能自己撸出东西来,那么它写的再好,也只能算纸上谈兵。继上一篇 《我们天天都在使用的套套符命令,Shell 在里面到...

1081

扫码关注云+社区

领取腾讯云代金券