angular中的promise用法

标签(空格分隔): angular


前言

Promise其实是一个规范,用类似then().then()这样的链式调用形式来处理因为异步带来意大利面条式的代码(多层函数嵌套)。

多层函数嵌套的原因是,因为js的异步特性,导致我们后面函数需要用到这个异步函数获取的数据或者结果时,必须要等异步函数处理完成。所以必须写在这个异步函数结尾。

Angular中的promise:$q

Angular把promise封装成了一个服务$q方便我们到处使用它。

当我们用console.log打印$q时,我们发现它是一个函数。实际还是封装了deferred对象。


  1. var $Q = function Q(resolver) {
  2. if (!isFunction(resolver)) {
  3. throw $qMinErr('norslvr', "Expected resolverFn, got '{0}'", resolver);
  4. }
  5. var deferred = new Deferred();
  6. function resolveFn(value) {
  7. deferred.resolve(value);
  8. }
  9. function rejectFn(reason) {
  10. deferred.reject(reason);
  11. }
  12. resolver(resolveFn, rejectFn);
  13. return deferred.promise;
  14. };

然后我们console.log一下$q.defer()这个对象,发现控制台给我们一个Deferred对象,具体有以下方法

  1. notify:用于通知then(),异步函数处理进度
  2. promise:在处理做完notifyreject,或者resolve时,存储信息,然后作为一个promise对象返回
  3. reject:数据获取失败,或处理函数出错,返回error原因
  4. resolve:数据获取成功,返回正确的数据

使用$q方法:

  • $q是可以用在同步过程中的,我们先看在同步过程中的应用:
  1. var app = angular.module('app',[]);
  2. app.controller('MyCtrl',['$q','$scope''$timeout',function($scope,$q,$timeout){
  3. var defer = $q.defer();
  4. defer.resolve('data');
  5. defer.reject('error');
  6. defer.promise.then(function(data){
  7. console.log(data);//成功时显示data
  8. },function(error){
  9. console.log(error);//失败显示error
  10. })
  11. }])

promise是一种模式,也适用于同步方式

  • 异步方式
  1. var app = angular.module('app', []);
  2. app.controller('MyCtrl', ['$scope', '$q', '$timeout' ,function ($scope,$q,$timeout) {
  3. function async(sex){
  4. var defer = $q.defer();
  5. $timeout(function () {
  6. defer.notify("查询性别中");
  7. if (sex == 'male') {
  8. defer.resolve(sex);
  9. }else {
  10. defer.reject(sex);
  11. }
  12. },2000);
  13. return defer.promise;
  14. }
  15. var sex = 'male';
  16. var promise = async(sex);
  17. promise.then(function (data) {
  18. console.log(data);
  19. }, function (error) {
  20. console.log(error);
  21. },function (notify) {
  22. console.log(notify);
  23. });
  24. }]);

我们在这里通过$timoue模拟异步,然后返回defer.promise。通过操作这个返回的promise给下个then函数使用。

其他方法

$q还有其他的方法,比如when,all,finally。

when:传递一个值

all:传递多个promise,必须全部执行成功,然后才能执行回调。

finally:是和then方法对应的函数,是所有的then执行完之后,然后执行他,无论成功失败,都会被执行。

这里在使用all时,需要在注意,每个defer只能传递一个值,resolve或者reject只能一个。需要用多个defer才能传递多个。

而且resolve是没有返回值的

  1. var app = angular.module('app', []);
  2. app.controller('MyCtrl', ['$scope', '$q', '$timeout' ,function ($scope,$q,$timeout) {
  3. var a = $q.defer();
  4. var b = $q.defer();
  5. var c = $q.defer();
  6. a.resolve('a');
  7. b.resolve('b');
  8. c.resolve('c');
  9. $q.all([a.promise,b.promise,c.promise]).then(function (data) {
  10. console.log(data);
  11. }, function (error) {
  12. console.log(error);
  13. });
  14. }]);//如果把这里的all编程when,那么后面的data就不是一个数组,而是一组promise,when是原值传递

angular中的promise的更多相关文章

  1. angular中使用promise

    promise是一种用异步的方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或者抛出的异常,在与远程对象打交道时我们可以把他看作是远程对象的一个代理. 如果说是promise也是 ...

  2. 浅谈angular中的promise

    promise目的就是为了跳出回调地狱.老掉牙的东西,大神轻拍. 举个最简单的例子:请求数据(getData),解析数据(executeData),显示数据(showData). //获取数据 fun ...

  3. 深入理解jQuery、Angular、node中的Promise

    最初遇到Promise是在jQuery中,在jQuery1.5版本中引入了Deferred Object,这个异步队列模块用于实现异步任务和回调函数的解耦.为ajax模块.队列模块.ready事件提供 ...

  4. Angularjs中的promise

    promise 是一种用异步方式处理值的方法,promise是对象,代表了一个函数最终可能的返回值或抛出的异常.在与远程对象打交道非常有用,可以把它们看成一个远程对象的代理. 要在Angular中创建 ...

  5. Angular中的$q的形象解释及深入用法

    作者:寸志链接:https://zhuanlan.zhihu.com/p/19622332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 早上,老爸说:“儿子,天气如何 ...

  6. 形象的讲解angular中的$q与promise(转)

    以下内容摘自http://www.ngnice.com/posts/126ee9cf6ddb68 promise不是angular首创的,作为一种编程模式,它出现在……1976年,比js还要古老得多. ...

  7. promise在angular中的基本使用

    promise在angular中的基本使用 <!DOCTYPE html> <html ng-app="myApp"> <head> <m ...

  8. 原创:形象的讲解angular中的$q与promise

    promise不是angular首创的,作为一种编程模式,它出现在……1976年,比js还要古老得多.promise全称是 Futures and promises.具体的可以参见 http://en ...

  9. Deferred在jQuery和Angular中的使用与简单实现

    Deferred在jQuery和Angular中的使用与简单实现 Deferred是在jQuery1.5版本中加入的,并且jQuery使用它完全重写了AJax,以前也只是偶尔使用.但是上次在使用Ang ...

随机推荐

  1. Nginx/Apache日志分析脚本

    1,查看apache进程: ps aux | grep httpd | grep -v grep | wc -l 2,查看80端口的tcp连接: netstat -tan | grep "E ...

  2. VMware 11完全安装Mac OS X 10.10

    本文已迁移到我的个人网站 http://www.wshunli.com 文章地址: http://www.wshunli.com/2016/03/17/VMware-12安装Mac-OS-X-10-1 ...

  3. 安装Ubuntu双系统系列——更换源

    Ubuntu 有一个非常有用的命令 apt-get,它可以帮助你下载软件,还可以安装,下载并安装的命令是 apt-get install. 那Ubuntu默认是从哪里下载软件呢,这可以查看文件/etc ...

  4. javascript 小日历

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx. ...

  5. Red hat Linux(Centos 5/6)安装R语言

    Red hat Linux(Centos 5/6)安装R语言1 wget http://cran.rstudio.com/src/base/R-3/R-3.0.2.tar.gz2 tar xzvf R ...

  6. 网站开发中的相对URL问题--JSP

    问题描述: 入门网站开发时,我们会在相对URL问题上有疑惑.例如,在一个jsp页面中引入css外部文件, <link rel="stylesheet"          hr ...

  7. virtualbox怎么装系统OVA虚拟包大全一键安装

    1 第一步,下载ova虚拟包 http://pan.baidu.com/s/1hqxWkUo . 里面有win7.ubuntu.kali,你自己挑一个需要的 全都可以自动缩放屏幕,有VirtualBo ...

  8. I.MX6 Android Linux shell MMPF0100 i2c 设置数据

    #!/system/bin/busybox ash # # I.MX6 Android Linux shell MMPF0100 i2c 设置数据 # 说明: # 本文主要记录通过shell脚本来设置 ...

  9. sql 统计用的sql

    mh:工时   mhtype:工时类型(6种) 字段:userid      mhtype    mh       001          1        5       001          ...

  10. LA3942-Remember the Word(Trie)

    题意: 有s个不同的单词,给出一个长字符串把这个字符串分解成若干个单词的连接(可重复使用),有多少种分解方法 分析: dp[i]表示i开始的字符串能分解的方法数 dp[i]=sum(dp[i+len( ...