目录
1.Promise是什么:
promise是es6新生的的异步操作一个对象,也可以说是一个容器,是一个链式执行的方式,只看重结果,不考虑中间的监听过程,执行结束后只有两种结果(成功,失败)中的一种,一旦执行完成就结束了。
2.基本用法:
promise有个构造函数,有两个参数resolve和reject,当时执行到resolve后,会执行.then().then()的方法,执行了reject和执行.catch的方法,如果不调用reject和resolve,则不会调用.then和.catch的方法,reject(xxx)和resolve(xxx)的参数会传入到catch和then里
const promise = new Promise(function(resolve, reject) { // ... some code if (/* 异步操作成功 */){ resolve(value); } else { reject(error); } }).then().then()(次数不限,链式执行).catch()
变形:如果需要延迟执行:
new Promise((resolve,reject)=>{
setTimeout(resolve|reject,1000,xxx)
}).then().catch()
注意:Promise 新建后立即执行,所以首先输出的是Promise。然后,then方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出
变形:在一个promise调用另一个promise:p2在一秒后调用resolve,此时传入的是p1,所以p2就在等待p1的操作结果,过了两秒之后,p2变为reject,p1一会变为reject,也就是说p2决定p1状态
const p1 = new Promise(function (resolve, reject) { setTimeout(() => reject(new Error('fail')), 3000) }) const p2 = new Promise(function (resolve, reject) { setTimeout(() => resolve(p1), 1000) }) p2 .then(result => console.log(result)) .catch(error => console.log(error)) // Error: fail
注意点:一般来说调用了reslove和reject之后,Promise的使命就完成了,就不需要再resolve()||reject()后面继续添加逻辑,应该放在then||catch里面
例如:new Promise((resolve, reject) => { return resolve(1); // 后面的语句不会执行 console.log(2); })
3.Promise中的catch:
如果该对象状态变为resolved,则会调用then方法指定的回调函数;如果异步操作抛出错误,状态就会变为rejected,就会调用catch方法指定的回调函数,处理这个错误。另外,then方法指定的回调函数,如果运行中抛出错误,也会被catch方法捕获。
const promise = new Promise(function(resolve, reject) { resolve('ok'); throw new Error('test'); });此时resolve执行了就不会执行catch
4.Promise中的finally:
finally是promise最后会执行的方法不管是什么状态,finally执行不需要任何参数:
promise .then(result => {···}) .catch(error => {···}) .finally(() => {···});
5.promise.race()
const p = Promise.race([p1, p2, p3]);)
上面代码中,只要p1、p2、p3之中有一个实例率先改变状态,p的状态就跟着改变。那个率先改变的 Promise 实例的返回值,就传递给p的回调函数。