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) })