Js 異步編程

并發(fā)與并行的區(qū)別?

并發(fā)是宏觀概念,我分別有任務A 和 任務B,在一段時間內(nèi)通過任務間切換完成了這兩個任務,這種情況就可以稱之為并發(fā)。
并行是微觀概念,假設CPU 中存在兩個核心,那么我就可以同時完成任務A、B。同時完成多個任務的情況可以稱之為并行。

回調(diào)地獄

回調(diào)地獄的根本問題:

  1. 嵌套函數(shù)存在耦合性,一旦有所改動,就會牽一發(fā)而動全身
  2. 嵌套函數(shù)一多,就很難處理錯誤。
  3. 不能使用 try catch,不能直接 return。

Promise

涉及面試題:Promise的特點是什么,分別有什么優(yōu)缺點?什么是Promise鏈?promise 構造函數(shù)執(zhí)行和then 函數(shù)執(zhí)行有什么區(qū)別?

Promise 翻譯過來就是承諾的意思,這個承諾會在未來有一個確切的答復,并且改承諾有三種狀態(tài),分別是:

  1. 等待中 (pending)
  2. 完成了 (resolved)
  3. 拒絕了 (rejected)

這個承諾一旦從等待狀態(tài)變成為其他狀態(tài)永遠不能更改狀態(tài)了,也就是說一旦狀態(tài)變?yōu)?resolved后,就不能再次改變。

var promise = new  Promise ((resolve, reject) => {
    if (異步操作成功) {
        resolve(value)
    } else { 
        異步操作失敗
        reject(new Error())
    }
})

當我們在構造 Promise 的時候,構造函數(shù)內(nèi)部的代碼是立即執(zhí)行的。

new Promise((resolve, reject) => {
  console.log('new Promise')
  resolve('success')
})
console.log('finish')

Promise 實現(xiàn)了鏈式調(diào)用,也就是說每次調(diào)用 then 之后返回的都是一個 Promise ,并且是一個全新的 Promise,原因也是因為狀態(tài)不可變。如果你在 then 中 使用了 return,那么 return 的值會被 Promise.resolve() 包裝

Promise.resolve(1)
  .then(res => {
    console.log(res)
    return 2
  })
  .then(res => {
    console.log(res)
  })
  輸出 => 1 2

使用 Promise 加載圖片

  // 加載圖片
  let preloadImage = function (path) {
    return new Promise((resolve, reject) => {
      let image = new Image()
      image.onload = resolve
      image.onerror = reject
      iamge.src = path
    })
  }

異步終極解決方案 asyncawait

await 我們從名字可以看出來意思是等待異步的意思,即它可以讓異步回調(diào)變得像同步函數(shù),并且會阻塞下一步,但是!這一切都是發(fā)生在async中的,而async是異步的,所以整個js并不會被阻塞。所以await要寫在async中。當然單純的await和async是并不能解決問題??梢钥吹竭€是需要promise的。

// async await
  // 異步方法一
  function takeLongTime() {
    return new Promise((resolve, reject) => {
      setTimeout(()=> resolve(10), 1000)
    })
  }
  // 異步方法二
  function takeLongTime2(v) {
    console.log(v)
    return new Promise(resolve => {
      setTimeout(() => resolve(v + 20), 10)
    })
  }
  
  async function test() {
    // 先執(zhí)行 takeLongTime 然后 執(zhí)行 takeLongTime2
    // 將 takeLongTime 中得到的結果傳給takleLongTime2中
    const v = await takeLongTime()
    const b = await takeLongTime2(v)
    console.log(b)
  }
  // 執(zhí)行 test 方法
  test()
  // 輸出結果為 10  30
最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容