Promise和Async
同步和异步
同步
- 当程序1调用程序2时,程序1停下不动,直到程序2完成回到程序1来,程序1才继续执行下去。
- 逐条执行,一条时间线
异步
-
当程序1调用程序2时,程序1径自继续自己的下一个动作,不受程序2的的影响。
-
常见异步
- 操作型事件 (概念中不算是异步,但是操作型事件需要时间)
- Load事件 (异步,需要加载)
- Settimeout
- setInterval
- requestAnimationFrame
-
先停止等待运行结束,然后再继续后续的运行
promise
ES6规定,Promise对象是一个构造函数,用来生成Promise实例
ES6为解决异步回调而生
Promise对象的基本语法:
- new Promise((resolve,reject) => {
//…
});
状态:
- pending 准备状态
- fullfiled 执行resoled的状态
- rejected 执行rejected的状态
调用
- Promise
New Promise(function(resolve,reject){
})
- .Then (fn1,fn2){
1:resolve所执行的函数
2:reject所执行的函数
}
- 另一种写法
.Then(fn1){
Resolve 执行的
}.catch(fn2){
Reject执行的
}
Promise.all()
- 返回一个 Promise 实例
Promise.race()
- 返回一个 promise,一旦迭代器中的某个promise解决或拒绝,返回的 promise就会解决或拒绝
- 谁最先完成就执行谁
Promise.resolve()
- 将现有对象转换为Promise对象,从而控制异步流程
Promise.reject()
- 返回一个带有拒绝原因的Promise对象
几个问题:
-
是否可以连续then
- 可以
- 如果这里面有return ,promise对象就会继续执行下一个then中的内容,下一个then 中对应的执行对象仍然是当前的promise代码
-
代码执行的顺序
- 在promise对象的then和catch中都是异步的,除此之外,都是同步的
- Promise对象方法中,then 和catch方法本身就是异步的
- Promise中resolve和reject执行干扰问题,只能执行一个,具有一定的排他性。跟顺序相关
Async/Await
基于Promise实现的
- 使得异步代码看起来像同步代码
Async函数执行后返回一个promise对象
Await只能写在async函数中
Await只能处理promise对象等待
Async函数中使用的return 返回的内容可以通过then来获取
区别
- Async把promise强化了
- 不存在谁替代谁
微任务、宏任务
宏任务
- 将当前的任务挪到下一个新的任务列的最顶端执行
- setTiimeout
- setInterval
微任务
-
将当前任务列的内容挪至当前任务列的最底端执行
-
promise
- Promise从then开始是微任务
执行顺序
- 微任务内的微任务,优于微任务执行
- 宏任务里面的微任务比微任务里面的宏任务优先
XMind: ZEN - Trial Version