ES6 Promise介绍
1、什么是Promise
Promise 是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大。
这么说可能不够直观的理解,看下面的例子
// callback回调函数 function getCallback(n,callback) { setTimeout(() => { var num = 2*n console.log('num',num) callback(num) },2000) } getCallback(3,function callback(n) { console.log('n',n) }) // Promise函数的基础用法(等同于上面的回调函数) function runPro(n){ let p = new Promise((resolve,reject) => { setTimeout(() => { var num = 2*n console.log('num',num) resolve(num) },2000) }) return p } runPro(3).then((res) => { console.log('res',res) })
这么看是不是觉得Promise并没有什么特别的,而且还要费尽封装,有这功夫用回调函数就好了,那么在看下面的例子
// 三层callback回调函数(传说的回调地狱) function getCallback0(n,callback1) { setTimeout(() => { var num0 = 2*n console.log('num0',num0) callback1(num0,function callback2(params,callback3) { let num2 = params + 1 console.log('num2',num2) callback3(num2) }) },2000) } getCallback0(3,function callback1(n,callback2) { let num1 = n+1 console.log('num1',num1) callback2(num1,function callback3(params) { let num3 = params + 1 console.log('num3',num3) } ) }) // 三层Promise(等同于上面的回调函数) function runPro0(n){ let p = new Promise((resolve,reject) => { setTimeout(() => { var num0 = n*2 console.log('num0',num0) resolve(num0) },2000) }) return p } runPro0(3) .then((res) => { // console.log('res',res) let Pro1 = new Promise((resolve,reject) =>{ var num1 = res+1 console.log('num1',num1) resolve(num1) }) return Pro1 }) .then((res) =>{ // console.log('res',res) let Pro2 = new Promise((resolve,reject) =>{ var num2 = res+1 console.log('num2',num2) resolve(num2) }) return Pro2 }) .then((res) =>{ var num3 = res+1 console.log('num3',num3) // 如果需要可以继续回调 })
通过上面的对比可以很清除的看出,用Promise处理异步事件更加简洁直观
2、基础用法
const p = new Promise(function(resolve,reject){ if(success){ resolve('成功的结果') }else{ reject('失败的结果') } }) p.then(function (res) { // 接收resolve传来的数据,做些什么 },function (err) { // 接收resolve传来的数据,做些什么 }) p.catch(function (err) { // 接收resolve传来的数据或者捕捉到then()中的运行报错时,做些什么 })
p.finally(function(){
//不管什么状态都执行
})
3、Promise的相关方法
Promise.prototype.then() Promise.prototype.catch() Promise.prototype.finally() Promise.resolve() Promise.reject() Promise.all() Promise.race()
由代码可以看出.then() .catch() .finally()都是定义在原型对象上的
4、then 的用法
由上面的代码可以看出.then()接收两个参数,第一个是resolved状态的回调函数,第二个是rejected状态的回调函数
function getNumber1(){ var p = new Promise(function(resolve, reject){ setTimeout(function(){ console.log('1') resolve('随便什么数据1'); }, 1000); }); return p; } function getNumber2(){ var p = new Promise(function(resolve, reject){ setTimeout(function(){ console.log('2') reject('随便什么数据2'); }, 2000); }); return p; } function getNumber3(){ var p = new Promise(function(resolve, reject){ setTimeout(function(){ console.log('3') reject('随便什么数据3'); }, 3000); }); return p; } Promise.all([getNumber1(),getNumber2(),getNumber3()]) .then(function(res){ console.log('res',res) console.log('res',res[2].data) },function (err){ console.log('err',err) }) .catch(function(err2){ console.log('err2',err2) })
注意:
1、Promise定义后就执行,所有通常用函数进行分装
2、Promise.all()中的参数是以一个数组传入的