setTimeout(()=>{ console.log(1) }) new Promise((resolve,reject)=>{ console.log(2) resolve() }) .then(()=>{ console.log(3) }) new Promise((resolve,reject)=>{ console.log(4) resolve() }) .then(()=>{ console.log(5) }) setTimeout(()=>{ console.log(6) }) console.log(7) /* 2 4 7 3 5 1 6 */
解析这道题以前咱们先了解几个知识点~~~~javascript
dom操做java
setTimeout(function(){ console.log(1); },0) console.log(2); //执行结果 : 2 , 1 -->先执行console,log(2) setTimeout异步挂起
宏任务通常是:包括总体代码script,setTimeout,setInterval。node
微任务:Promise,process.nextTick。ajax
宏任务的异步 和微任务的异步同时都有 优先执行 微任务promise
一、首先:promise 的建立是同步的,then、catch是异步,因此先执行同步打印出2 4 7 二、异步的 一、三、五、6,进入事件队列。 三、setTimeout 为宏任务,promise为微任务,先执行微任务,因此三、5先被打印出来,一、6后被打印出来
异步代码同步执行多线程
1.三个状态 : pending (进行时) resolve (成功状态), reject(失败的状态).dom
2.使用时 须要实例化 new Promise()异步
3.Promise() 参数是一个回调函数async
4.在回调函数中有两个参数函数
resolve reject
5.promise返回值为promise
6.promise的方法
两个参数 都是回调函数 若是promise 执行resolve方法 执行为.then里面第一个回调 若是promise 执行reject方法 执行为.then里面第二个回调
当promise执行了reject方法的时候 执行的是.catch里面的回调
js是单线程,防止被堵塞 node中将全部i/o变成异步
异步的过多嵌套会形成回调地狱
promise的链式调用能够解决回调地狱
async function text(){ return true } text() .then((data)=>{ console.log("ok") }) .catch((err)=>{ console.log("err") })
//求和操做 function num1(){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(1) },1000) }) } function num2(){ return new Promise((resolve,reject)=>{ setTimeout(()=>{ resolve(2) },500) }) } async function sum(){ let res1=await num1() let res2=await num2() reyturn res1 + res2 } sum() .then((data)=>{ console.log(data) })