同步任务
前一个任务结束后再执行后一个任务,程序的执行顺序与任务的排列顺序是一致的、同步的。
异步任务
异步任务由JavaScript 委托给宿主环境进行执行
当同步任务执行完成后,会通知JavaScript 主线程执行异步任务的回调函数
额外的两个方法
1.process.nextTick
同步任务执行完执行的
2.setImmediate
当前事件循环结束后执行的
宏任务与微任务
(异步任务可以再划分为宏任务和微任务)
宏任务
计时器,Ajax(前后端数据交互),读取文件
微任务
promise.then
执行顺序
- 先执行同步任务
- 执行process.nextTick
- 执行微任务
- 执行宏任务
- 执行setImmediate
回调地狱
异步任务需要执行回调函数(es5通过回调函数拿到异步数据)解决,多个任务需要控制顺序执行的时候就会出现函数的嵌套,那么执行回调函数就会出现回调地狱。
局限性:代码不方便维护
为了解决回调地狱出现了Promise对象
解决异步编程(如利用then解决回调地狱问题)
语法如下:
let p = new Promise(function(resolve,reject){
resolve("hello world");
reject("fail")
})
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
p.then(function(data){
console.log(data)},
function(reason){
console.error(reason)}
)
resolve可以将异步数据传递出来,reject为失败
(es6)通过then可以拿到异步数据
Promise的三种状态
- pendind(进行中)
- fulfilled(已成功)
- rejected(已失败)
局限
但是写起来也是比较复杂,不太容易维护
于是出现了generator函数『es6提供的异步编程解决方案』来解决promise问题——一直通过then方法链式函数也比较复杂
generator函数中:
1.function关键字和函数名之间有*
2.函数体内部用yield表达式,定义不同的内部状态(类似于promise的then)进行下一步下一步操作
为了更简洁,又出现了async和await函数
async函数
1.返回值是promise对象
2.里面需要写await函数
await函数
1.必须写在async函数里面
2.右边表达式为promise对象
3.await返回的是promise成功的值(直接获取resolve传递出来的异步数据)
4.await的promise失败了,就抛出异常,需要通过try catch来捕获处理