ES6 - Promise
本文不是promise的基础教程。是我个人对promise的一些知识点。
1.Promise的状态
Promise有三种状态: pending fulfilled rejected
初始状态为 pending,pending可以变为fulfilled,或者变成rejected。但是状态变化完成后不可以再变化。
所以如果在函数里Promise接受的函数中写了多个reslove(),也只能执行第一个噢
2.Promise的链式调用
首先创建两个Promise对象
1 let state = [true, false] 2 function getA () { 3 return new Promise((reslove, reject) => { 4 setTimeout(()=> { 5 let a = Math.random() 6 console.log('a', a) 7 let ar = a.toString().slice(0,5) 8 let as = state[Math.round(a)] 9 if(as) { 10 reslove(ar) 11 } else{ 12 reject(ar) 13 } 14 }, 100) 15 }) 16 } 17 18 function getB () { 19 return new Promise((reslove, reject) => { 20 setTimeout(()=> { 21 let b = Math.random() 22 console.log('b', b) 23 let br = b.toString().slice(0,5) 24 let bs = state[Math.round(b)] 25 if(bs) { 26 reslove(br*2) 27 } else{ 28 reject(br*2) 29 } 30 }, 1000) 31 }) 32 }
进行链式调用。
getA().then(data=> { console.log('Asucess', data) return getB() }).catch (data=> { console.log('Afail', data) return false }).then(data=> { if(data) { console.log('Bsucess' ,data) } else { console.log(' is error ') } }).catch (data=> { console.log('Bfail', data) })
在以上代码中,使用了两次then()方法。
第一个then()方法返回了一个新的Promise,所以第二个.then()就是新的Promise对象的回调了。
有人可能会问,如果第一个then()方法没有返回的不是一个Promise呢?
那就会通过Promise.reslove()方法把返回值变成Promise对象。
// Promise.resolve的用法 let a = Promise.resolve(123) a.then((result) => { console.log(result) // 123 }) let b = Promise.resolve({name:'xiaoming', age:18}) b.then((result) => { console.log(result) // {name:'xiaoming', age:18} })
3.Promise.all()&Promise.race()
Promise.all()是所有的promise状态改变后执行,race是其中一个改变就执行
Promise.all([getA(), getB()]).then(function (results) { console.log(results); // 获得一个Array: [ar的值, br的值] }); Promise.race([getA(), getB()]).then(function (results) { console.log(results); // ar的值 });
4.微任务
Promise 的回调函数属于异步任务,会在同步任务之后执行。但是,Promise 的回调函数不是正常的异步任务,而是微任务(microtask)。它们的区别在于,正常任务追加到下一轮事件循环,微任务追加到本轮事件循环。这意味着,微任务的执行时间一定早于正常任务。
setTimeout(function() { console.log(1); }, 0); new Promise(function (resolve, reject) { resolve(2); }).then(console.log); console.log(3); // 3 // 2 // 1