promise入門

前言

老生常談promise 對於promise大部分人應該不陌生了,他是ES6的新特性之一,若是你是一個追求潮流的coder那麼你應該用過axios請求方式,這個向後臺發送請求的方式就用到了promise 我接觸promise是一年前,部門的程序員會輪流培訓,恰好當時我在看一些關於axios的東西,就準備培訓一些關於promise的知識,因此我就找了不少關於promise的博客,看的也是雲裏霧裏,可想而知培訓的效果也不是很好ios

promise再探

promise很火,能夠說是程序員居家旅行必備的技能之一了,因此說對於這樣的東西,咱們最好仍是吃透它,這樣纔不會在代碼當中迷失。程序員

promise的做用

大多數人開發的過程當中應該都會遇到一些異步的問題,好比咱們必須等請求接口返回數據後纔去作另一些事情,咱們都是經過回調函數來作 大部分好的狀況是隻須要等待一個異步的結果就能夠去作一些事情,那麼極端的狀況是不一樣的異步嵌套,讓咱們的代碼看上去就像一個金字塔,一層層的異步嵌套讓咱們頭皮發麻,這種狀況被咱們稱爲回調地獄編程

fs.readFile('./sample.txt', 'utf-8', (err, content) => {
    let keyword = content.substring(0, 5);
    db.find(`select * from sample where kw = ${keyword}`, (err, res) => {
        get(`/sampleget?count=${res.length}`, data => {
           console.log(data);
        });
    });
});
複製代碼
回調的缺點
  • 嵌套太深,難以維護
  • 有些狀況下沒法正常使用return和throw
  • 沒法正常檢索出堆棧信息

promise就能夠解決這些問題,可讓咱們的代碼跟優雅更具備可讀性,給promise下個定義axios

promise是異步編程的一種解決方案,比回調函數更何理更強大promise

咱們從使用層面上再來定義如下promise瀏覽器

  • 主要用於異步計算
  • 能夠將異步操做隊列化,讓程序按照指望的順序來執行,返回符合預期的結果
  • 能夠在對象之間傳遞和操做promise,幫助咱們處理隊列

#####同步和異步 你們都知道同步和異步,可是讓你給他下個定義你知道嗎?bash

通常而言,操做分爲兩種發出調用和獲得結果,發出調用當即獲得結果爲同步,發出調用,沒法當即獲得結果,須要一些額外的操做才能獲得預期的結果爲異步。同步是在發出調用後一直等待程序是阻塞狀態,異步發出調用後程序能夠繼續執行dom

異步操做的常見用法
  • 事件偵聽與響應
dom.addEventListener(type,callback)
$(dom).on(type,callback)
複製代碼
  • 在瀏覽器中異步操做以事件爲主

promise的三種狀態

  • pendding 實例化時候的狀態
  • fullfilled 操做成功後
  • rejected 被否決操做失敗 promise實例的後兩種狀態一經改變後不會再次改變,好比狀態改爲fullfilled不會在改爲rejected

promise的結構

new Promise((resolve,reject)=>{
      //此處執行一段異步代碼 (這個部分被稱爲執行器)
      //異步處理有結果以後執行對應的
      resolve() //操做成功調用此回調,把promise的實例狀態改爲fullfilled
      reject()   //操做失敗調用此回調,把promise的實例狀態改爲rejected
  }).then((res,rej) => {

})
複製代碼

在then函數裏返回一個新的promise,then支持兩個參數,分別對應上一個promise實例的兩個回調 then能夠鏈式的調用,當前面一個promise的狀態改變時,後面的then會根據前面一個promise的狀態執行對應狀態的回調 (這個地方有一個坑 由於須要手動return) 異步

image.png
接用慕課網老師的一張圖,看一下整個流程

  • 實例化promise
  • 執行器執行一段異步代碼
  • 判斷執行成功或者失敗分別調用resolve()或者rejected()
  • resolve()或者rejected()改變promise實例的狀態
  • 執行then裏面的對應promise狀態的回調,成功執行res(),失敗執行rej()
  • then返回新的promise下一個then會根據新返回來的promise的實例執行對應狀態的res()或者rej()

promise是一個代理對象,它和原先的操做並未關係,咱們只須要把原先的操做放入執行器裏 它經過一個回調函數,而後把其它的回調所有基於此回調函數異步編程

相關文章
相關標籤/搜索