Promise in AngularJS
What's promise
Angular’s event system provides a lot of power to our Angular apps. One of the most powerful features that it enables is automatic resolution of promises.
Promises are a method of resolving a value or not in an asynchronous manner. Promises are objects that represent the return value or a thrown exception that a function may eventually provide.
Promises are incredibly useful in dealing with remote objects and we can think of them as a proxy for them.
- Only one resolve or reject will ever be called
- – resolve will be called with a single fulfillment value
- – reject will only be called with a single rejection reason
- If the promise has been resolved or rejected, any handlers depending upon them will still be called
- Handlers will always be called asynchronously
Promise in AngularJS
Angular’s event-loop gives angular the unique ability to resolve promises in it’s $rootScope. $evalAsync stage (see under the hood for more detail on the run loop). The promises will sit inert until the $digest run loop finishes.
bind promise and view directly
This allows for Angular to turn the results of a promise into the view without any extra work. It enables us to assign the result of an XHR call directly to a property on a $scope object and think nothing of it. For instance, we might have a list of friends in a view, like so:
<
li ng-repeat=
"friend in friends">
{{ friend.
name }}
</
li>
</
ul>
'myApp', [])
.controller(
'DashboardController', [
'$scope',
'UserService',
function($scope, UserService) {
// UserService's getFriends() method
// returns a promise
$scope.friends
= User.getFriends(
);
}]);
How to create a promise
In order to create a promise in Angular, we’ll use the built-in $q service. The $q service provides a few methods in it’s deferred API.
1. inject $q service
First, we’ll need to inject the $q service into our object where we want to use it.
'myApp', [])
.factory(
'UserService', [
'$q',
function($q) {
// Now we have access to the $q library
}]);
2. $q.defer()
= $q.defer();
three methods and the
single promise property that can be used in dealing with the promise.
resolve(value)
.resolve({name
:
"Ari", username
:
"@auser"});
reject(reason)
.reject(
"Can't update user");
// Equivalent to
deferred.resolve(
$q.reject(
"Can't update user"));
notify(value)
promise property
'UserService', [
'$q',
function($q) {
var getFriends
=
function(id) {
var deferred
=
$q.defer();
// Get friends from a remote server
$http.get(
'/user/'
+ id
+
'/friends')
.success(
function(data) {
deferred.resolve(data.friends);
})
.error(
function(reason) {
deferred.reject(reason);
});
return
deferred.promise;
}
}]);
3. interact with promise
then(successFn, errFn, notifyFn)
successFn or the
errFn asynchronously as soon as the result is available. The callbacks are always called with a single argument: the result or the rejection reason.
notifyFn callback may be called zero or more times to provide a progress status indication before the promise is resolved or rejected.
The then() method always returns a new promise which is either resolved or rejected through the return value of the successFn or the errFn. It also notifies through the notifyFn.
catch(errFn)
.catch(function(reason){}):
'/user/'
+ id
+
'/friends')
.
catch(
function(reason) {
deferred.reject(reason);
});
finally(callback)
'finally'](
function() {});
- These promise chains are how Angular can support $http’s interceptors.
- $q is integrated with the angular $rootScope model, so resolutions and rejections happen quickly inside the angular
- $q promises are integrated with angular’s templating engine which means that any promises that are found in the views will be resolved/rejected in the view
- $q is tiny and doesn’t contain the full functionality of the Q library
$q library
all(promises)
combine into a single promise, then we can use the $q.all(promises) method to combine them all into a single promise. This method takes a single argument:
defer()
reject(reason)
This will create a promise that is resolved as rejected with a specific reason. This is specifically designed to give us access to forwarding rejection in a chain of promises.
This is akin to throw in javascript. In the same sense that we can catch an exception in javascript and we can forward the rejection, we’ll need to rethrow the error. We can do this with $q.reject(reason).
This method takes a single parameter:
when(value)
This allows for us to deal with an object that may or may not be a promise.
Promise in AngularJS的更多相关文章
- angularJS中XHR与promise
angularJS应用是完全运行在客户端的应用,我们可以通过angularJS构建一个不需依赖于后端,同时能够实现动态内容和响应的web应用,angularJS提供了将应用与远程服务器的信息集成在一起 ...
- angularJS笔记之Promise
Promise是一种模式,以同步操作的流程形式来操作异步事件,避免了层层嵌套,可以链式操作异步事件. 我们知道,在编写javascript异步代码时,callback是最最简单的机制,可是用这种机制的 ...
- 以todomvc为例分析knockout、backbone和angularjs
一.整体结构 项目github地址https://github.com/tastejs/todomvc/ 排除通用的css样式文件和引用的js库文件,仅看html和js 1.1 knockoutjs版 ...
- AngularJS(Part 10)--页面导航
页面导航 过去,一个URL代表一个页面.但是随着Ajax的兴起,情况发生的很大的变化.不同的内容可以使用同一个URL.这让浏览器中的回退.前进甚至收藏按钮都失去了作用.而AngularJS提供 ...
- amgular $q用法
amgular $q用法 在用JQuery的时候就知道 promise 是 Js异步编程模式的一种模式,但是不是很明白他跟JQuery的deferred对象有什么区别.随着公司项目的进行,要跟后台 ...
- Angular简单应用剖析
这一篇我们将一起感受学习一个小型的.活生生的应用,而不是继续深入分析哪些单个的特性.我们将会一起感受一下,前面所讨论过的所有片段如何才能真正的组合在一起,形成一个真实的.可以运行的应用. GutHub ...
- Angular中的$q的形象解释及深入用法
作者:寸志链接:https://zhuanlan.zhihu.com/p/19622332来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 早上,老爸说:“儿子,天气如何 ...
- IT_Qestion
1. Javascript 回调 Promise 2. Angularjs $parent 3. CSS margin padding border 4. Angularjs $filter 5. D ...
- AngularJS 中的Promise --- $q服务详解
先说说什么是Promise,什么是$q吧.Promise是一种异步处理模式,有很多的实现方式,比如著名的Kris Kwal's Q还有JQuery的Deffered. 什么是Promise 以前了解过 ...
随机推荐
- Python开发【第九篇】:HTML (二)
python[第十四篇]HTML基础 时间:2016-08-08 20:57:27 阅读:49 评论:0 收藏:0 [点我收藏+] 标签: 什么是HTML? H ...
- Day1 - Python基础1 介绍、基本语法、流程控制
Python之路,Day1 - Python基础1 本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼 ...
- Session深入理解
Session是在什么情况下产生的 客户端访问服务器端,服务器端为每个用户生成一个唯一的sessionId,是这样吗?sessionId的作用是什么? http://www.cnblogs.com/s ...
- C# 带参访问接口,WebClient方式
1.当参数的数据较大时.WebClient同步. //实例化WebClient client = new WebClient();//地址 string path = "http://oa. ...
- windows 8.1 administrator相关设置
一.windows 8.1 开启administrator用户 windows8.1中文版,由于默认不开启administrator用户,所以需要自己手动开启 启用administrator:在cmd ...
- http请求的cookie
Cookie的作用: Cookie是用于维持服务端会话状态的,通常由服务端写入,在后续请求中,供服务端读取. HTTP请求,Cookie的使用过程 1.server通过HTTP Response中的& ...
- js 函数参数形式
1. var a = function(b,c){ console.log(arguments);}a("1","cc"); -> ["1&q ...
- 【windows开发实现记事本程序——界面篇】
前言 从毕业开始学习windows UI编程,工作中总是和一些API打交道,但是从没有做过一个完整的界面程序.因此打算自己利用空余时间做一个小的项目来总结自己所学的东西.在网上看到许多人建议自己动手写 ...
- 人民币符号¥在css和html正确显示
商城项目需要涉及到人民币的页面现实问题.但是¥(指的是通常输入法中文全角模式下按shift+4的那个)在宋体(v3.03, v5.0)的情况下是显示一杠.常见的其他字体微软雅黑(Microsoft Y ...
- 初涉JavaScript模式 (2) : 基本技巧
尽量少用全局变量 大量使用全局变量会导致的后果 全局变量创建以后会在整个JavaScript应用和Web页面中共享.所有的全局变量都存在于一个全局命名空间内,很容易发生冲突 不知不觉创建了全局变量 其 ...