1、什么是Promise
1.1、常见异步处理
Promise是抽象异步处理对象以及对其进行操作的组件。
Promise最初被提出是在E语言,E语言是基于并列/并行处理设计的一种编程语言。
常见基于javaScript的异步处理大都利用回调函数
1
2
3
4
5
6
7
8-
//使用回调函数的异步处理
getAsync("fileA.txt", function(error, result){
if(error){
throw error;
}
});
-
1.2、使用Promise进行异步处理
Promise则是把类似的异步处理对象和处理规则规范化,并按照统一的接口来编写,而采取规定方法之外的写法都会出错。
1
2
3
4
5
6
7
8//使用Promise进行异步处理
var promise = getAsyncPromise("fileA.txt");
promise.then(function(result){
//获取文件内容成功时的处理
}).catch(function(error){
//获取文件内容失败时的处理
});
<1>返回promise对象
我们可以向预设了抽象化异步处理的promise对象,注册这个promise对象执行成功和失败时相应的回调函数。
这里与常见异步处理操作不同,需严格遵守规则,无法自由的定义回调函数的参数。
所以,promise的功能是可以将复杂的异步处理轻松地进行模式化
1.3、Promise简介
三种API类型
Constructor
Promise类似XMLHttpRequest,从构造函数promise新建一个promise对象作为接口。
1
2
3
4
5//创建promise对象
var promise = new Promise(function(res,rej){
//异步处理
//处理完后,调用resolve或reject
});
Instance Method
通过new生成promise对象,promise.then()方法可以设置在resolve(成功)/reject(失败)时调用的回调函数。
promise.then(onFulfilled, onRejected)
resolve(成功)时
onFulfilled 会被调用
reject(失败)时
onRejected 会被调用
只想对异常进行处理时可以采用 promise.then(undefined, onRejected)这种方式,
只指定reject时的回调函数即可。
不过这种情况下 promise.catch(onRejected) 应该是个更好的选择。
Static Method
辅助方法:promise.all()
promise.resolve()
1.3.1、Promise workflow
1 | function asyncFunction() { |
1.2.2、Promise的状态
用new Promise实例化的promise对象有以下三个状态:
“has-resolution” - Fulfilled
resolve(成功)时。此时会调用 onFulfilled
“has-rejection” - Rejected
reject(失败)时。此时会调用 onRejected
“unresolved” - Pending
既不是resolve也不是reject的状态。也就是promise对象刚被创建后的初始化状态等
状态变化
promise对象的状态,从Pending转换为Fulfilled或Rejected之后, 这个promise对象的状态就不会再发生任何变化。
也就是说,Promise与Event等不同,在.then 后执行的函数可以肯定地说只会被调用一次。