所谓Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果。从语法上说,Promise 是一个对象,从它可以获取异步操作的消息。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。
–《ECMAScript6入门》
(1)他的状态不受外界影响,promise对象有三种状态,pending
,fulfilled
,rejected
,只有在promise对象内,通过异步操作的结果来设定当前promise对象的状态。
(2)一旦状态改变了就不会再变了,pending
->fulfilled
,pending
->rejected
,promise一旦完成以上两种状态转换之一,就不会再变换状态,与event不同的是,promise就算状态改变已经发生,再去设置监听函数,也是可以马上得到结果的,
var promise = new Promise(function(resolve,reject){
if(/*异步操作成功*/){
resolve(value);
}else{
reject(error);
}
});
promise对象在构造的时候传入一函数,该函数有两个参数,resolve
是一个函数,将promise对象的状态从pending
转换到fulfilled
,而reject就是将状态从pending
转换到rejected
,要注意的是,当状态转换完成后,并不会停止工作,而是会继续执行完毕整个函数。
然后可以在promise实例对象中使用then
函数来作出进一步处理
promise.then(function(value){
//success
},function(error){
//failure
})
then函数接受两个函数作为参数,第一个参数是resolve
的时候调用,第二个参数是rejected
的时候调用,但是一般来说,第二个参数是不使用的,一般使用catch
函数来捕捉错误
promise.then(function(value){
//getImage返回一个promise
return getImage(value.url);
).then{
//then返回的是一个promise,与一开始的promise不是同一个对象
//所以then可以链式调用
function(data){
//something
}
}.catch{
//处理错误
}
无论catch
前面有多少个then
,catch
都可以捕捉到,也就是说,then
的error是有冒泡性的。
与try/catch
块不同,promise
的如果没有处理catch
,代码是不会停止工作的,会继续工作下去,相当于吃掉了这个错误,但是和try/catch
块相同的是,promise
也有finally,作用与try/catch
相同,都是与状态无关最后都会执行的函数。
promise.all()
接收一个数组或者有Iterator接口的参数,每一个成员都是promise实例,这个函数返回一个新的promise实例,其状态由all
函数的成员决定的,当全部成员的状态都为fulfilled
的时候,新的promise实例的状态才会是fulfilled
。
若promise成员中有被rejected的promise,那么第一个被rejected的promise将会是新promise实例的回调函数的参数。否则,所有promise成员的返回的值会组成一个数组返回给新的promise的回调函数。
const databasePromise = connectDatabase();
const booksPromise = databasePromise
.then(findAllBooks);
const userPromise = databasePromise
.then(getCurrentUser);
Promise.all([
booksPromise,
userPromise
])
.then(([books, user]) => pickTopRecommendations(books, user));
与Promise.all()
用法基本相同,但是在如其名,race,返回的是最先完成的异步函数的结果
Promise.resolve()
有四种类型的参数
1、promise
实例->返回这个实例
2、带then
方法的对象,也就是thenable对象->会跟踪立刻执行then方法并跟踪其状态。
3、不具有then
方法的对象与不是对象的参数->返回的promise实例状态一定是resolve
,并将参数传给回调函数
4、不带参->返回一个resolve
状态的promise
对象
Promise.reject(reason)
返回一个状态为rejected
的promise
对象实例,要注意的是,Promise.reject()
方法的参数,会原封不动地作为reject
的reason
,变成后续方法的参数。这一点与Promise.resolve
方法不一致。
const thenable = {
then(resolve, reject) {
reject('出错了');
}
};
Promise.reject(thenable)
.catch(e => {
console.log(e === thenable)
})
// true
以上例子均来源于《ECMAScript6标准入门》