同步与异步
程序的执行顺序
遇到同步任务直接执行,遇到异步任务先将其放入任务队列中,接着往下执行,直至所有同步任务执行完毕,再去任务队列中执行所有异步任务(异步任务是同时执行的)
异步任务
- 定时器setTimeout、setInterval
- ajax请求
- promise.then
- saync await
其中,异步任务分为宏任务及微任务,先执行微任务,再执行宏任务。
微任务:promise.then、saync await
宏任务:setTimeout、setInterval、ajax
process.nextTick
是微任务,在所有微任务之前执行
setImmediate
是宏任务,在所有宏任务之后执行
整个JavaScript的执行过程:
- 同步任务
- process.nextTick
- 微任务:promise、async await
- 宏任务:setTimeout、setInterval、ajax
- setImmediate
Promise
- Promise构造函数接收一个函数作为参数,该函数的两个参数是resolve,reject。异步任务执行成功时调用resolve函数返回结果,反之调用reject
- Promise 类有
.then()
.catch() 和 .finally() 三个方法,这三个方法的参数都是一个函数,.then()
可以将参数中的函数添加到当前 Promise 的正常执行序列,.catch() 则是设定 Promise 的异常处理序列,.finally() 是在 Promise 执行的最后一定会执行的序列。.then()
传入的函数会按顺序依次执行,有任何异常都会直接跳到 catch 序列 - Promise中的内容是同步的,
.then()
中的内容是异步的 - 调用了 resolve() 方法后才会将 .then() 中的内容加到任务队列中。resolve() 中可以传入一个参数,该参数可以在 .then() 中拿到。
例子
function fn(msg) {
return new Promise(function (resolve, reject) {
console.log(msg);
resolve('OK');
});
}
fn('password').then((data)=>{
console.log(data);
})
// password OK