ES6学习之Promise

什么是Promise

所谓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前面有多少个thencatch都可以捕捉到,也就是说,then的error是有冒泡性的。
try/catch块不同,promise的如果没有处理catch,代码是不会停止工作的,会继续工作下去,相当于吃掉了这个错误,但是和try/catch块相同的是,promise也有finally,作用与try/catch相同,都是与状态无关最后都会执行的函数。

Promise.all()

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.race()

Promise.all()用法基本相同,但是在如其名,race,返回的是最先完成的异步函数的结果

Promise.resolve()和Promise.reject()

Promise.resolve()有四种类型的参数
1、promise实例->返回这个实例
2、带then方法的对象,也就是thenable对象->会跟踪立刻执行then方法并跟踪其状态。
3、不具有then方法的对象与不是对象的参数->返回的promise实例状态一定是resolve,并将参数传给回调函数
4、不带参->返回一个resolve状态的promise对象

Promise.reject(reason)返回一个状态为rejectedpromise对象实例,要注意的是,Promise.reject()方法的参数,会原封不动地作为rejectreason,变成后续方法的参数。这一点与Promise.resolve方法不一致。

const thenable = {
  then(resolve, reject) {
    reject('出错了');
  }
};

Promise.reject(thenable)
.catch(e => {
  console.log(e === thenable)
})
// true

以上例子均来源于《ECMAScript6标准入门》

你可能感兴趣的:(ES6,Promise,JavaScript)