[AngularJS] AngularJS系列 进阶篇之promise

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[AngularJS] AngularJS系列 进阶篇之promise相关的知识,希望对你有一定的参考价值。

目录

 

在上节中,我们在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

 

以上是关于[AngularJS] AngularJS系列 进阶篇之promise的主要内容,如果未能解决你的问题,请参考以下文章

[angularjs] angularjs系列笔记模型

[AngularJS] AngularJS系列 基础篇

[angularjs] angularjs系列笔记指令

AngularJS 1.x系列:AngularJS简介及第一个应用

ionic+AngularJS系列知识——什么是AngularJS

[angularjs] angularjs系列笔记控制器