JavaScript

超轻量级php框架startmvc

AngularJS中的promise用法分析

更新时间:2020-05-13 06:24:01 作者:startmvc
本文实例讲述了AngularJS中的promise用法。分享给大家供大家参考,具体如下:JavaScript异步回

本文实例讲述了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 promise