详解promise

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
2
3
4
5
6
7
8
9
10
11
12
function asyncFunction() {
return new Promise(function (resolve, reject) {
setTimeout(function () {
resolve('Async Hello world');
}, 16);
});
}
asyncFunction().then(function (value) {
console.log(value); // => 'Async Hello world'
}).catch(function (error) {
console.log(error);
});

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 后执行的函数可以肯定地说只会被调用一次。

-------------本文结束感谢您的阅读-------------
显示 Gitment 评论