異步-promise、async、await

下面代碼打印結果是?
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

數據加載方案

  • 同步加載
  • 異步加載 : 事件 , 定時器 , ajax

js單線程語言

爲何是單線程語言?

dom操做java

  • 若是js是多線程語言,第一個線程執行把dom對象刪除,另外一個線程執行把dom對象添加
同步代碼異步代碼加載順序 : event loop (事件循環)
  • 先執行同步代碼,異步任務掛起
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後被打印出來

promise 承諾 是一個對象

異步代碼同步執行多線程

1.三個狀態 : pending (進行時) resolve (成功狀態), reject(失敗的狀態).dom

2.使用時 須要實例化 new Promise()異步

3.Promise() 參數是一個回調函數async

4.在回調函數中有兩個參數函數

​ resolve reject

5.promise返回值爲promise

6.promise的方法

  • .then()
兩個參數 都是回調函數
若是promise 執行resolve方法   執行爲.then裏面第一個回調
若是promise 執行reject方法   執行爲.then裏面第二個回調
  • .catch()
當promise執行了reject方法的時候  執行的是.catch裏面的回調
  • .all()
  • .race()

異步

js是單線程,防止被堵塞 node中將全部i/o變成異步

異步的過多嵌套會形成回調地獄

promise的鏈式調用能夠解決回調地獄

async
  • 能夠修飾一個函數,被修飾的函數返回promise對象
  • async 返回值可有也能夠沒有,返回的是返回的數據就是then 接收的數據,不返回數據至關於undefined
async function text(){
    return true
}
text()
.then((data)=>{
    console.log("ok")
})
.catch((err)=>{
    console.log("err")
})
await
  • 在async函數內部使用,將promise變成同步
  • await關鍵字後面跟Promise對象
//求和操做
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)
})
  • 使用async函數可讓代碼簡潔不少,不須要像Promise同樣須要些then,不須要寫匿名函數處理Promise的resolve值,也不須要定義多餘的data變量,還避免了嵌套代碼。
相關文章
相關標籤/搜索