- 首先,
Promise
并不是发源于javascript
,它最早被提出于E
语言中. - 那到底什么是
Promise
,它是抽象异步处理对象以及对其进行各种操作的组件,JS中Promise
的出现,很大程度上降低了异步编程的复杂性.
处理js中的异步,我用得最多的就是回调函数,那么Promise和回调函数在处理异步问题时的异同点是什么,又是如何使用的呢?带着这些问题,我们一起来学习Promise
吧
Promise特点
- 在回调函数中,通常我们的第一个参数都是ERROR对象,但这只是一种惯例,并未规范化,即就是不这样写也不会出错
- 但在
Promise
中 则是把类似的异步处理对象和处理规则进行规范化, 并按照采用统一的接口来编写,而采取规定方法之外的写法都会出错,对应其处理结果Promise
都提供了统一的接口then()
,以及对应的异常处理接口catch()
.
基于 Promise
的统一接口的做法, 就可以形成基于接口的各种各样的异步处理模式。所以,promise
的功能是可以将复杂的异步处理轻松地进行模式化.
Promise API
大致分为三种类型
-
Constructor
Promise
是一个构造函数,我们可以通过该构造函数来创建一个新的Promise
对象,具体是通过new方法来调用该构造函数
let p1 = new Promise(function(resolve,reject){
//异步处理
//调用resolve或者reject方法来处理异步结果
})
-
Instance Method
通过new Promise
得到的Promise
对象,需要设置在异步处理成功或者失败时所要调用的回调函数,它有两个方法,then()
和catch()
then()
:promise.then(onFulfilled, onRejected)
onFulfilled
和onRejected
分别是异步处理成功和失败时所要调用的两个函数,且都是可选的
若只处理成功时的结果:promise.then(onFulfilled)
若只处理失败时的结果:promise.then(undefined, onRejected)
但后者还有一个更好的选择,就是catch()
: promise.catch(onRejected)
-
Static Method
Promise
全局对象还有几个静态方法
Promise.all(iterable)
:返回所有成功的Promise对象或者某一个失败的Promise对象
Promise.race(iterable)
:返回一个成功或者失败的Promise对象,以先发生者为准
Promise.resolve(value)
:返回指定结果的Promise对象
Promise.reject(reason)
:返回一个Promise 对象,并且指定了失败原因
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);
});
//上面的代码中对异常处理用了catch(),当然也可以只用then()
asyncFunction().then(function (value) {
console.log(value); // => 'Async Hello world'
},function(err){
console.log(err);
});
Promise State
由new Promise()
得到的对象,有三种状态,pending,resolve和reject
pending:既不是 resolve 也不是 reject 的状态。也就是 promise 对象刚被创建后的初始化状态等
resolve:成功状态,此时会调用onFulfilled
reject:失败状态,此时会调用onRejected
三种状态的转换关系如下:
未完~