最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

微信小程序網(wǎng)絡(luò)層封裝的實(shí)現(xiàn)(promise, 登錄鎖)

 更新時(shí)間:2019年05月08日 11:33:51   作者:海洋餅干  
這篇文章主要介紹了微信小程序網(wǎng)絡(luò)層封裝(promise, 登錄鎖),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

一、對(duì)小程序的request的封裝

寫(xiě)過(guò)小程序的應(yīng)該知道,微信的request不封裝基本上不能用,寫(xiě)的顯的太冗長(zhǎng),而且是回調(diào)式的,回調(diào)地獄什么的就不說(shuō)了,可讀性差。

下面是我的封裝代碼,順便支持一下promise。

function baseRequest({ url, method, header, data, complete }, resolve, reject) {
 wx.request({
 url,
 method,
 header,
 data,
 success: function (res) {
  // 需要判斷服務(wù)器code的用這一段
  // 我司服務(wù)器返回0表示真正的成功,其他code表示各種錯(cuò)誤碼
  // if (res.data.code === 0) {
  // resolve(res)
  // } else {
  // reject(res)
  // }
  resolve(res)
 },
 fail: function (res) {
  reject(res)
 },
 complete: function (res) {
  complete(res)
 }
 })
}

function requestPromise( options ) {
 let req = new Promise((resolve, reject) => {
 baseRequest(options, resolve, reject)
 })
 return req
}

function get(options) {
 options.method = 'GET'
 return requestPromise(options)
}

function post(options) {
 options.method = 'POST'
 if (!options.header) {
 options.header = {}
 }
 options.header["Content-Type"] = "application/x-www-form-urlencoded"
 return requestPromise(options)
}

function put(options) {
 options.method = 'PUT'
 if (!options.header) {
 options.header = {}
 }
 options.header["Content-Type"] = "application/x-www-form-urlencoded"
 return requestPromise(options)
}


module.exports = {
 get,
 post,
 put
}

如何使用:

1. 將上面的代碼寫(xiě)到一個(gè)獨(dú)立的文件里,我的命名為network.js。

2. 然后將其綁定到全局的 wx 對(duì)象身上。 wx.Network = require('./network.js')。(在app.js里面綁定)

3. 實(shí)例如下

wx.Network.get({
 url: 'xxx.xxx.xxx', // 請(qǐng)求路徑
 data: {
  a: "a" // 參數(shù)列表
 }
 }).then(res => {
  console.log("請(qǐng)求成功")
 }).catch(res => {
  console.log("請(qǐng)求失敗") 
 })

二、登錄鎖

基本的request請(qǐng)求封裝完了后,還有一些特殊的需求,比如

1. 在首頁(yè)我會(huì)進(jìn)行登錄, 登錄后獲得token, 然后我拿著token去請(qǐng)求其他需要token才可以請(qǐng)求的接口 (比如個(gè)人購(gòu)物信息)

2. 這個(gè)時(shí)候一種做法是登錄完成前不進(jìn)行需要token的請(qǐng)求,并且有蒙板進(jìn)行攔截操作(正在登錄ing...)

3. 對(duì)于我公來(lái)說(shuō)這種方法有一個(gè)致命的弊端,就是在高并發(fā)的情況下,服務(wù)器的壓力很大,首頁(yè)的登錄接口很慢才有返回(進(jìn)首頁(yè)即自動(dòng)登錄),這個(gè)時(shí)候,用戶看到的界面就是loading,而且可能時(shí)間比較長(zhǎng),如果用戶對(duì)你的產(chǎn)品粘性不高,絕大部分人直接就走了

4. 為了優(yōu)化這種情況下的用戶體驗(yàn),我們?nèi)嫒∠说卿浀膌oading,替換成了“登錄鎖”的形式

5. 效果為未登錄調(diào)用需要token的接口時(shí),不請(qǐng)求,直到登錄完成后才會(huì)請(qǐng)求

6. 即如果這個(gè)請(qǐng)求需要token,那么先判斷有沒(méi)有登錄,如果沒(méi)有登錄,啟動(dòng)定時(shí)器一段時(shí)間后(200ms),再次判斷,如果已經(jīng)登錄,發(fā)出請(qǐng)求,如果沒(méi)有,重復(fù)以上操作

加了登錄鎖后的代碼如下: ( 添加了新的 wait 函數(shù),調(diào)用get,post,put時(shí)增加第二個(gè)參數(shù),表示是否需要token )

function baseRequest({ url, method, header, data, complete }, resolve, reject) {
 wx.request({
 url,
 method,
 header,
 data,
 success: function (res) {
  // 需要判斷服務(wù)器code的用這一段
  // 我司服務(wù)器返回0表示真正的成功,其他code表示各種錯(cuò)誤碼
  // if (res.data.code === 0) {
  // resolve(res)
  // } else {
  // reject(res)
  // }
  resolve(res)
 },
 fail: function (res) {
  reject(res)
 },
 complete: function (res) {
  complete(res)
 }
 })
}

function wait(options, needToken, resolve, reject) {
 if (needToken) {
 var token = wx.getStorageSync('token')
 if (!token) {
  setTimeout(() => {
  wait.apply(null, arguments)
  }, 200)
 } else {
  if (!options.header) {
  options.header = {}
  }
  options.header["token"] = token
  baseRequest(options, resolve, reject)
 }
 } else {
 baseRequest(options, resolve, reject)
 }
}

function requestPromise( options, needToken = true ) {
 let req = new Promise((resolve, reject) => {
 wait(options, needToken, resolve, reject)
 })
 return req
}

function get(options, needToken) {
 options.method = 'GET'
 return requestPromise(options, needToken)
}

function post(options, needToken) {
 options.method = 'POST'
 if (!options.header) {
 options.header = {}
 }
 options.header["Content-Type"] = "application/x-www-form-urlencoded"
 return requestPromise(options, needToken)
}

function put(options, needToken) {
 options.method = 'PUT'
 if (!options.header) {
 options.header = {}
 }
 options.header["Content-Type"] = "application/x-www-form-urlencoded"
 return requestPromise(options, needToken)
}


module.exports = {
 get,
 post,
 put
}

如何使用:(使用方式和上面一樣,只是調(diào)用的時(shí)候多一個(gè)參數(shù))

1. 將上面的代碼寫(xiě)到一個(gè)獨(dú)立的文件里,我的命名為network.js。

2. 然后將其綁定到全局的 wx 對(duì)象身上。 wx.Network = require('./network.js')。(在app.js里面綁定)

3. 實(shí)例如下

wx.Network.get({
 url: 'xxx.xxx.xxx', // 請(qǐng)求路徑
 data: {
  a: "a" // 參數(shù)列表
 }
 }, true // 增加第二個(gè)參數(shù),true表示需要token, false表示不需要
 ).then(res => {
  console.log("請(qǐng)求成功")
 }).catch(res => {
  console.log("請(qǐng)求失敗") 
 })

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 靈活使用console讓js調(diào)試更簡(jiǎn)單的方法步驟

    靈活使用console讓js調(diào)試更簡(jiǎn)單的方法步驟

    這篇文章主要介紹了靈活使用console讓js調(diào)試更簡(jiǎn)單的方法步驟,適當(dāng)使用這些方法可以使調(diào)試更容易,更快速,更直觀,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2019-04-04
  • JavaScript中的定時(shí)器之Item23的合理使用

    JavaScript中的定時(shí)器之Item23的合理使用

    window對(duì)象提供了兩個(gè)方法來(lái)實(shí)現(xiàn)定時(shí)器的效果,分別是window.setTimeout()和window.setInterval。其中前者可以使一段代碼在指定時(shí)間后運(yùn)行;而后者則可以使一段代碼每過(guò)指定時(shí)間就運(yùn)行一次
    2015-10-10
  • JS中Iframe之間傳值的方法

    JS中Iframe之間傳值的方法

    在js中,我們時(shí)常用到用iframe做系統(tǒng)框架,在子頁(yè)面也,父頁(yè)面之間的值傳遞是一個(gè)問(wèn)題,下面是js獲取父窗體和子窗體的對(duì)象js:
    2013-03-03
  • JavaScript實(shí)現(xiàn)動(dòng)態(tài)表單生成

    JavaScript實(shí)現(xiàn)動(dòng)態(tài)表單生成

    這篇文章主要來(lái)和大家一起深入探討如何使用JavaScript實(shí)現(xiàn)一個(gè)動(dòng)態(tài)表單生成器,文中的示例代碼講解詳細(xì),有需要的小伙伴可以參考一下
    2024-01-01
  • 用innerHTML?。Ψ?hào)副值給文本框后會(huì)變成&的方法

    用innerHTML?。Ψ?hào)副值給文本框后會(huì)變成&的方法

    用innerHTML?。Ψ?hào)副值給文本框后會(huì)變成&的方法...
    2007-07-07
  • JavaScript異步加載淺析

    JavaScript異步加載淺析

    這篇文章主要介紹了JavaScript異步加載淺析,本文講解了腳本延遲執(zhí)行、腳本的完全并行化、可編程的腳本加載等內(nèi)容,需要的朋友可以參考下
    2014-12-12
  • javascript[js]獲取url參數(shù)的代碼

    javascript[js]獲取url參數(shù)的代碼

    多瀏覽器兼容用javascript獲取url參數(shù)的方法比較推薦的一種
    2007-10-10
  • 如何開(kāi)發(fā)出更好的JavaScript模塊

    如何開(kāi)發(fā)出更好的JavaScript模塊

    給大家分享一下如何才能開(kāi)發(fā)出更好的JavaScript模塊和功能,有興趣的朋友參考學(xué)習(xí)下吧。
    2017-12-12
  • 有趣的bootstrap走動(dòng)進(jìn)度條

    有趣的bootstrap走動(dòng)進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了如何實(shí)現(xiàn)有趣的bootstrap走動(dòng)進(jìn)度條,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-12-12
  • webpack源碼中一些精妙的方法總結(jié)

    webpack源碼中一些精妙的方法總結(jié)

    正好最近在學(xué)習(xí)webpack的源碼,所以下面這篇文章主要給大家介紹了關(guān)于webpack源碼中一些精妙的方法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-02-02

最新評(píng)論

大新县| 铜川市| 巢湖市| 万山特区| 镇坪县| 高淳县| 岐山县| 昭苏县| 县级市| 连州市| 正定县| 盐山县| 青田县| 南京市| 盖州市| 沧州市| 温泉县| 讷河市| 遂昌县| 安泽县| 无极县| 乐都县| 鄂托克前旗| 嘉兴市| 灌云县| 嘉定区| 黔西| 略阳县| 剑阁县| 莆田市| 娱乐| 盐津县| 全南县| 凤山市| 通山县| 广宁县| 龙川县| 芦溪县| 游戏| 攀枝花市| 望城县|