Promise 之初探


陳舊的知識應該更新一下了,先嘗試一下 Promise ,主要參考 https://www.cnblogs.com/whybxy/p/7645578.html

定義一個函數

直接上干貨,定義一個函數:

const myPost = (url, data) => {
    // 接收url 和data,向后端提交
    console.log('url:', url)
    console.log('data:', data)
    const p = new Promise((resolve,reject)=>{ // resolve,reject是形式參數,可以是任意寫法,如(res, rej),默認第一個參數實現的是resolve功能;第二個參數實現的是reject功能。
      console.log("myPost:")
      data.push('處理完畢') 
      resolve(data) // 返回參數
      // resolve()不同於return, resolve()執行完成后后面的代碼還會執行。
      reject('失敗了')
    })
    return p
  }

這個函數,假裝要向后端提交申請,然后返回后端給的數據。

const p = new Promise() 定義一個實例,簡單理解,resolve 是成功的回調函數,reject 是失敗的回調函數。

注意:這里只是簡單理解,實際上並不完全是這樣。

單次調用

        myPost('url1', [1,2,3]).then((data) => {
          console.log("單次調用的結果:")
          console.log(data)
        },(msg) => {
          console.log('myPost的else'+msg)
        })

傳入url和需要提交的數據,然后在then里面等待結果。then里面第一個方法是成功的回調,第二個方法是失敗的回調。

我們看一下運行結果:

依次調用

        myPost('urla', [1,2,3]).then((data) => {
          console.log("第一個調用完成:")
          console.log(data)
          return myPost('urlb', data) // 發起第二次請求
        }).then((data) => {
          console.log("第二個調用完成:")
          console.log(data)
          return myPost('urlc', data) // 發起第三次請求
        }).then((data) => {
          console.log("第三個調用完成:")
          console.log(data)
          return myPost('urld', data) // 發起第四次請求
        }).then((data) => {
          console.log("第四個調用完成:")
          console.log(data)
        })

有的時候需要多次向后端提交申請,而且需要前一次申請得到的數據,才能發起下一次申請。
那么可以用這種依次申請的方式。

先發起第一個申請,然后得到數據,然后依據數據發起第二次申請,同理可以依次發起n次申請。

因為是得到結果才能發起下次申請,所以提交順序和返回順序皆可以控制。

看一下運行結果:

這里有個小問題,第一次訪問的結果里面 console.log(data) 出來的是四個數組元素,這個是期待的,但是打開看里面卻有7個。這就奇怪了。

批量一起調用

        Promise.all([
          myPost('urla', [1,2,3]),
          myPost('urlb', [1,2,3]),
          myPost('urlc', [1,2,3])
        ]).then((data) => {
            console.log("一起調用,一起返回:")
            console.log(data)
            console.log(data[1])
        },(msg) => {
          console.log(msg)
        })

有的時候,向后端發出的申請,可以一起提交,並不需要上次返回的結果,那么可以這么寫,這樣是不是比then.then.then的好看多了。

那么返回的數據是啥樣子的呢?是數組,順序和上面提交的順序是一致的。

我們來看看結果:

這里也有個意外,本來以為一起調用的結果,會出現在依次訪問的第四次訪問結果的后面。
但是實際情況卻發生了“亂入”。
一起訪問的結果,插入了依次訪問的“內部”。

這里並沒有使用settimeout來模擬后端訪問,本來以為都是順序執行,但是實際並不是,估計是promise內部的一些原理導致的,先不去研究了,暫時先這樣。第一步先會用,知道返回的順序的特點。

這里的返回結果,並沒有出現數組元素數量莫名增加的情況。問題出在哪里,在繼續研究。

疑問:

  • 你可能會奇怪,這個根本就沒有任何訪問后端的代碼嘛,忽悠人是不是?
    其實並不是,現在流行的axios就是依據promise來實現的,也就是說axios本身就是一個promise實例,相當於函數里面的p。
    我們把promise的使用方式理解了之后,使用axios實現向后端的訪問,就輕松多了。
    另外這里是熟悉promise的用法,並不是熟悉axios的用法。

  • 另一個問題是,為啥要自己寫個函數,直接用axios不香嗎?
    這個和個人習慣有關系。我總是習慣自己再多加一層,這樣函數名稱、參數、返回方式就都可以歸我個人來控制了,
    這樣便於應對版本升級,更換第三方類庫,增加自己想要的功能。
    比如我想加入前端存儲的功能,提交的數據在前端 localStorage 里面保存一份的話,就可以直接在自己定義的函數里面實現,而不用在頁面代碼里面增加調用的函數。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM