Promise 是异步编程的一种解决方案
promise实例的三个状态
pending(进行中)
resolved(已完成)
rejected(已拒绝)
特点:
将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数。流程更加清晰,代码更加优雅
Promise对象提供统一的接口,使控制异步操作更加容易
缺点
无法取消Promise,一旦新建它就会立即执行,无法中途取消
如果不设置回调函数,Promise内部抛出的错误,不会反应到外部
当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成);结果变成了某种状态后,不再更改
宏任务与微任务(都为异步任务)
宏任务:包括整体代码script(可以理解为外层同步代码)、settimeout、setInterval、i/o、ui render
微任务:promise、object.observe、MutationObserver(监听DOM树的变化)
执行顺序
先执行同步代码,遇到异步宏任务则将异步宏任务放入宏任务队列中,遇到异步微任务则将异步微任务放入微任务队列中,当所有同步代码执行完毕后,再将异步微任务从队列中调入主线程执行,微任务执行完毕后再将异步宏任务从队列中调入主线程执行,一直循环直至所有任务执行完毕(事件循环EventLoop)
总结:放入队列时宏任务优先,将队列中的代码拿到执行栈中执行微任务优先
await后面的语句相当于放到了new Promise中,下一行及之后的语句相当于放在Promise.then中
Promise的all和race和any
.all():接收一组异步任务,然后并行执行异步任务,在所有异步操作执行完后才执行回调。
Promise.all()的状态变化与所有传入Promise实例对象状态有关,所有的状态都变成resolved,最终的状态才会变成resolved,只要有一个变成rejected,最终的状态就变成rejected
.race():接收一组异步任务,然后并行执行异步任务,只取第一个执行完成的异步操作的结果,其他的方法仍在执行,不过执行结果会被抛弃。
取决于第一个完成的Promise对象,如果第一个完成的成功了,那么最终的就成功,否则最终失败
.any():参数中的Promise都失败最终才会失败;
参数中只要有一个为成功状态,那么最终就是成功;返回是第一个成功的值,后面就不管了;
实际应用:一次性加载多张图片时,哪一张先加载出来就显示哪一张,此时就可以使用Promise.any()方法。
Then方法中return的作用
then方法执行后返回一个新的Promise对象。输出then方法,返回的promise对象的状态改变,是pending状态。在then的回调函数中,return 后面的东西,会用promise包装一下。如果不加return默认返回的永远是resolve的成功状态;加上return后,下一个then就会根据上一个return返回的promise状态来进行。
promise重点是:输出流程题