首页 > 代码库 > [AngularJS] AngularJS系列(7) 进阶篇之promise
[AngularJS] AngularJS系列(7) 进阶篇之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(‘未选中‘); }
}]
点击按钮:
到这里我们可以了解一下$q
的defer()
方法创建的对象具有哪些方法
resolve(value)
:用来执行deferred promise
,value
可以为字符串,对象等。reject(value)
:用来拒绝deferred promise
,value
可以为字符串,对象等。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系列(7) 进阶篇之promise
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。