AngularJS中的promise用法分析


Posted in Javascript onMay 19, 2017

本文实例讲述了AngularJS中的promise用法。分享给大家供大家参考,具体如下:

JavaScript异步回调有好处也有坏处,回调函数大量嵌套十分复杂.所以javascript中还有另一种异步处理模式叫promises.在AngularJS中的实现就是$q服务.

下面是一些小例子.

then,catch,finally

在链最后的 catch 为整个链式处理提供一个异常处理点
在链最后的 finally 总是会被执行,不管 promise 被处理或者被拒绝,起清理作用

<!DOCTYPE html>
<html>
  <head>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="bootstrap.min.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
    <script src="jQuery.min.js"></script>
    <script src="angular.min.js"></script>
    <script src="bootstrap.min.js"></script>
    <script type="text/javascript">
      var myapp = angular.module('myapp', []);
      myapp.controller('myController', function($scope, $q) {
        $scope.send = function() {
          var deferred = $q.defer();
          var promise = deferred.promise;
          promise
          .then(function() {
            console.log('resolve.....')
          }, function() {
            console.log('reject.....');
          }, function() {
            console.log('notify.....');
          })
          .catch(function() {
            console.log('catch..error..')
          })
          .finally(function() {
            console.log('anywhere will be called..');
          });
          deferred.reject('resolve');
        };
      });
    </script>
    <style type="text/css">
    </style>
  </head>
  <body ng-app="myapp">
    <div ng-controller="myController">
        <button class="btn" ng-click="send()">click</button>
    </div>
  </body>
</html>

then第三个参数(表征状态)的应用

<!DOCTYPE html>
<html>
  <head>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="bootstrap.min.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
    <script src="jquery.min.js"></script>
    <script src="angular.min.js"></script>
    <script src="bootstrap.min.js"></script>
    <script type="text/javascript">
      var myapp = angular.module('myapp', []);
      myapp.controller('myController', function($scope, dataService) {
        $scope.send = function() {
          dataService.getData()
          .then(function success(data) {
            console.log(data);
          }, function error(error) {
            console.log(error);
          }, function status(process) {
            console.log(process);
          });
        };
      });
      myapp.factory('dataService', function($q, $interval) {
        return {
          getData : function() {
            var deferred = $q.defer();
            var process = 0;
            var interval = $interval(function() {
              process += 10;
              deferred.notify(process);
              //reject之后不再继续运行
              // if (process == 50) {
              //   deferred.reject(process);
              // }
              if (process >= 100) {
                $interval.cancel(interval);
                deferred.resolve(process);
              }
            }, 1000);
            return deferred.promise;
          }
        };
      });
    </script>
    <style type="text/css">
    </style>
  </head>
  <body ng-app="myapp">
    <div ng-controller="myController">
        <button class="btn" ng-click="send()">click</button>
    </div>
  </body>
</html>

then链式

<!DOCTYPE html>
<html>
  <head>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="bootstrap.min.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
    <script src="jquery.min.js"></script>
    <script src="angular.min.js"></script>
    <script src="bootstrap.min.js"></script>
    <script type="text/javascript">
      var myapp = angular.module('myapp', []);
      myapp.controller('myController', function($scope, $q) {
        $scope.send = function() {
          var deferred = $q.defer();
          var promise = deferred.promise;
          promise
          .then(function() {
            console.log('1.....')
          })
          .then(function() {
            console.log('2....');
          });
          deferred.resolve('resolve');
        };
      });
    </script>
    <style type="text/css">
    </style>
  </head>
  <body ng-app="myapp">
    <div ng-controller="myController">
        <button class="btn" ng-click="send()">click</button>
    </div>
  </body>
</html>

then链会把上一个 then 的返回结果传递给调用链的下一个 then (如果没有就是 undefined).

<!DOCTYPE html>
<html>
  <head>
     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="bootstrap.min.css" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >
    <script src="jquery.min.js"></script>
    <script src="angular.min.js"></script>
    <script src="bootstrap.min.js"></script>
    <script type="text/javascript">
      var myapp = angular.module('myapp', []);
      myapp.controller('myController', function($scope, $q, $timeout) {
        $scope.send = function() {
          var deferred = $q.defer();
          var promise = deferred.promise;
          deferred.resolve('resolve');
          promise
          .then(function(data) {
            console.log(data);
            var _deferred = $q.defer();
            $timeout(function() {
            _deferred.resolve('resolve_');
            }, 1000);
            return _deferred.promise;
          })
          .then(function(data) {
            console.log(data);
          });
        };
      });
    </script>
    <style type="text/css">
    </style>
  </head>
  <body ng-app="myapp">
    <div ng-controller="myController">
        <button class="btn" ng-click="send()">click</button>
    </div>
  </body>
</html>

如果 then 返回一个 promise 对象,下一个 then 只会在这个 promise 被处理结束的时候调用。

希望本文所述对大家AngularJS程序设计有所帮助。

Javascript 相关文章推荐
点击文章内容处弹出页面代码
Oct 01 Javascript
JQuery live函数
Dec 24 Javascript
jquery 笔记 事件
Nov 02 Javascript
javascript中setAttribute()函数使用方法及兼容性
Jul 19 Javascript
jQuery mobile 移动web(6)
Dec 20 Javascript
D3.js实现柱状图的方法详解
Sep 21 Javascript
jquery实现多次上传同一张图片
Jan 09 Javascript
利用JS实现文字的聚合动画效果
Jan 22 Javascript
Vue实现按钮旋转和移动位置的实例代码
Aug 09 Javascript
简单实现vue中的依赖收集与响应的方法
Feb 18 Javascript
JavaScript中的this原理及6种常见使用场景详解
Feb 14 Javascript
JS写滑稽笑脸运动效果
May 28 Javascript
几种响应式文字详解
May 19 #Javascript
关于Bootstrap按钮组件消除黄框的方法
May 19 #Javascript
vue.js动态数据绑定学习笔记
May 19 #Javascript
Node.JS利用PhantomJs抓取网页入门教程
May 19 #Javascript
详解如何使用vue-cli脚手架搭建Vue.js项目
May 19 #Javascript
angularjs封装$http为factory的方法
May 18 #Javascript
bootstrap表单示例代码分享
May 18 #Javascript
You might like
PHP操作MongoDB时的整数问题及对策说明
2011/05/02 PHP
PHP 验证码不显示只有一个小红叉的解决方法
2013/09/30 PHP
PHP学习笔记(二) 了解PHP的基本语法以及目录结构
2014/08/04 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
javaScript(JS)替换节点实现思路介绍
2013/04/17 Javascript
Javascript中神奇的this
2016/01/20 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
Form表单按回车自动提交表单的实现方法
2016/11/18 Javascript
详解如何在Vue2中实现组件props双向绑定
2017/03/29 Javascript
详解Node中导入模块require和import的区别
2017/08/11 Javascript
JavaScript门面模式详解
2017/10/19 Javascript
vue单页开发父子组件传值思路详解
2018/05/18 Javascript
nodejs同步调用获取mysql数据时遇到的大坑
2019/03/02 NodeJs
layui表格内放置图片,并点击放大的实例
2019/09/10 Javascript
vue组件 keep-alive 和 transition 使用详解
2019/10/11 Javascript
详解Vue 数据更新了但页面没有更新的 7 种情况汇总及延伸总结
2020/05/28 Javascript
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
详细解读Python中的__init__()方法
2015/05/02 Python
举例简单讲解Python中的数据存储模块shelve的用法
2016/03/03 Python
不要用强制方法杀掉python线程
2017/02/26 Python
python中类变量与成员变量的使用注意点总结
2017/04/29 Python
Python实现识别手写数字 Python图片读入与处理
2020/03/23 Python
python中字符串比较使用is、==和cmp()总结
2018/03/18 Python
python统计多维数组的行数和列数实例
2018/06/23 Python
对Python subprocess.Popen子进程管道阻塞详解
2018/10/29 Python
python 多线程中子线程和主线程相互通信方法
2018/11/09 Python
python模块导入的细节详解
2018/12/10 Python
用python 绘制茎叶图和复合饼图
2021/02/26 Python
应届护士求职信范文
2014/01/26 职场文书
元宵节晚会主持人串词
2014/03/25 职场文书
集体生日活动方案
2014/08/18 职场文书
商场父亲节活动方案
2014/08/27 职场文书
党员民主生活会整改措施
2014/09/26 职场文书
质监局领导班子践行群众路线整改方案
2014/10/26 职场文书
服务员岗位职责
2015/02/03 职场文书
python实现学员管理系统(面向对象版)
2022/06/05 Python