你的位置:首页 > Java教程

[Java教程][AngularJS] AngularJS系列 进阶篇之promise


目录

  • 使用promise
  • then链
  • 扩展

 

在上节中,我们在http中使用了then 和 在ngResource中返回了一个'延迟对象'.

本节介绍一下angular中的promise.

我觉得可以把js中的promise比作c#中的Task 的await 以同步的时候 实现回调.

 

使用promise

HTML

  <input type="checkbox" ng-model="flag" />  <button ng-click="func()">Test</button>

 

Controller

['$scope', '$q', function (scope, q) {      scope.func = function () {        var defer = q.defer();//创建1个延迟加载对象 或 新建1个工作单元        var promise = defer.promise;//defer对象的核心 含有回调函数的句柄        promise.then(function (data) {          var msg = '成功:' + data;          console.log(msg);        }, function (data) {          var msg = '失败:' + data;          console.log(msg);        }, function (data) {          var msg = '通知:' + data;          console.log(msg);        });        defer.notify('开始执行');        scope.flag ? defer.resolve('选中') : defer.reject('未选中');      }
}]

 

点击按钮:

 

 

到这里我们可以了解一下$qdefer()方法创建的对象具有哪些方法

  • resolve(value):用来执行deferred promisevalue可以为字符串,对象等。
  • reject(value):用来拒绝deferred promisevalue可以为字符串,对象等。
  • notify(value):获取deferred promise的执行状态,然后使用这个函数来传递它。
  • then(successFunc, errorFunc, notifyFunc):无论promise是成功了还是失败了,当结果可用之后,then都会立刻异步调用successFunc,或者'errorFunc',在promise被执行或者拒绝之前,notifyFunc可能会被调用0到多次,以提供过程状态的提示。
  • catch(errorFunc)
  • finally(callback)

 

then链

我们稍微改了下上面的代码(这段代码是残缺的,只定义了success方法)

      scope.func2 = function () {        var defer = q.defer();        var promise = defer.promise;        promise.then(function (data) {          var msg = '成功:' + data;          return msg;        }).then(function (data) {          console.log(data);        });        defer.notify('开始执行');        scope.flag ? defer.resolve('选中') : defer.reject('未选中');      }

 

这里为了说明then函数和reject函数.我们看下demo

        promise.then(function (data) {          var msg = '成功:' + data;          return msg;        }, function (data) {          var msg = '失败:' + data;          return msg;        }).then(function (data) {          console.log(data);        }, function (erro) {          console.log('erro:' + erro);        });

 

这里为了区别 在第二个then的erro函数中 加了erro前缀

我们发现不会调用到此方法.

 

修改一下promise后:

        promise.then(function (data) {          var msg = '成功:' + data;          return msg;        }).then(function (data) {          console.log(data);        }, function (erro) {          console.log('erro:' + erro);        });

 

也可以返回promise

        promise.then(function () {          var thenDefer = q.defer();          $timeout(function () {            if (scope.flag)              thenDefer.resolve('done success');            thenDefer.reject('done faild');          }, 1000);          return thenDefer.promise;        }).then(function (data) {          console.log(data);        }, function (erro) {          console.log('erro:' + erro);        });

 

  • Promise 链会把上一个 then 的返回结果传递给调用链的下一个 then (如果没有就是 undefined)
  • 如果 then 回掉返回一个 promise 对象,下一个 then 只会在这个 promise 被处理结束的时候调用。
  • 在链最后的 catch 为整个链式处理提供一个异常处理点
  • 在链最后的 finally 总是会被执行,不管 promise 被处理或者被拒绝,起清理作用

 

扩展

$q.all(),允许你等待并行的 promise 处理,当所有的 promise 都被处理结束之后,调用共同的回调

$q.when(),如果你想通过一个普通变量创建一个 promise

 

 

本文地址:http://www.cnblogs.com/neverc/p/5928285.html