微信小程序:封裝原生網(wǎng)絡(luò)請(qǐng)求

由于本人之前都是做的app鞍盗,用微信小程序網(wǎng)絡(luò)感覺(jué) 可以封裝一下,所以就用自己淺微的技術(shù)進(jìn)行了封裝嫉戚。用的是es6的promise棒呛。

先上圖:
2.gif

1.什么是Promise

Promise 是異步編程的一種解決方案,其實(shí)是一個(gè)構(gòu)造函數(shù)告唆,自己身上有all棺弊、reject、resolve這幾個(gè)方法擒悬,原型上有then模她、catch等方法。

Promise對(duì)象有以下兩個(gè)特點(diǎn)茄螃。

(1)對(duì)象的狀態(tài)不受外界影響缝驳。Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):pending(進(jìn)行中)归苍、fulfilled(已成功)和rejected(已失斢糜)。只有異步操作的結(jié)果拼弃,可以決定當(dāng)前是哪一種狀態(tài)夏伊,任何其他操作都無(wú)法改變這個(gè)狀態(tài)。這也是Promise這個(gè)名字的由來(lái)吻氧,它的英語(yǔ)意思就是“承諾”溺忧,表示其他手段無(wú)法改變咏连。

(2)一旦狀態(tài)改變,就不會(huì)再變鲁森,任何時(shí)候都可以得到這個(gè)結(jié)果祟滴。Promise對(duì)象的狀態(tài)改變,只有兩種可能:從pending變?yōu)閒ulfilled和從pending變?yōu)閞ejected歌溉。只要這兩種情況發(fā)生垄懂,狀態(tài)就凝固了,不會(huì)再變了痛垛,會(huì)一直保持這個(gè)結(jié)果草慧,這時(shí)就稱(chēng)為 resolved(已定型)。如果改變已經(jīng)發(fā)生了匙头,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù)漫谷,也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同蹂析,事件的特點(diǎn)是舔示,如果你錯(cuò)過(guò)了它,再去監(jiān)聽(tīng)识窿,是得不到結(jié)果的斩郎。

let p = new Promise(function(resolve, reject){
        //做一些異步操作
        setTimeout(function(){
            console.log('執(zhí)行完成Promise');
            resolve('要返回的數(shù)據(jù)可以任何數(shù)據(jù)例如接口返回?cái)?shù)據(jù)');
        }, 2000);
    });

其執(zhí)行過(guò)程是:執(zhí)行了一個(gè)異步操作,也就是setTimeout喻频,2秒后缩宜,輸出“執(zhí)行完成”,并且調(diào)用resolve方法甥温。

在微信小程序運(yùn)用 Promise:


123.png

//service.js

//service.js
const wxRequest = require('wxRequest.js');
const config = require("config.js");
// 列表數(shù)據(jù)  type:video
function getBusInfoPromise(busName) {
  var getBusInfoUrl = config.BASE_URL;
  var data = { "type": busName}
  return wxRequest.wxPromise("POST", getBusInfoUrl, data);
}


module.exports = {
  getBusInfoPromise: getBusInfoPromise
}

////wxRequest.js


const Promise = require('es6-promise.min.js');

function wxPromise(method, url, data) {

  //返回一個(gè)Promise對(duì)象
  return new Promise(function (resolve, reject) {
    wx.request({
      url: url,
      method: method,
      data: data,
      //在header中統(tǒng)一封裝報(bào)文頭锻煌,這樣不用每個(gè)接口都寫(xiě)一樣的報(bào)文頭定義的代碼
      header: {
        "Content-Type": "application/json"
      },
      success: function (res) {
        // setTimeout(function () {
        //   wx.hideLoading();
        // }, 100);
        // //這里可以根據(jù)自己項(xiàng)目服務(wù)端定義的正確的返回碼來(lái)進(jìn)行,接口請(qǐng)求成功后的處理姻蚓,當(dāng)然也可以在這里進(jìn)行報(bào)文加解密的統(tǒng)一處理
        // if (res.data.code ==200) {
        //   resolve(res);
        // } else {
        //   //如果出現(xiàn)異常則彈出dialog
        //   wx.showModal({
        //     title: '提示',
        //     content: res.data.code + '系統(tǒng)異常',
        //     confirmColor: '#118EDE',
        //     showCancel: false,
        //     success: function (res) {
        //       if (res.confirm) {
        //       }
        //     }
        //   });
        // }
        resolve(res);
      },
      fail: function (res) {
        // setTimeout(function () {
        //   wx.hideLoading();
        // }, 100);
        // wx.showToast({
        //   title: '服務(wù)器暫時(shí)無(wú)法連接',
        //   icon: 'loading',
        //   duration: 2000
        // })
        reject(res);
      }
    });
  });
}


function getRequest(url, data) {
  return wxPromise("GET", url, data);
}

function postRequest(url, data) {
  return wxPromise("POST", url, data);
}

module.exports = {
  wxPromise: wxPromise,
  postRequest: postRequest,
  getRequest: getRequest,
}

在wxml對(duì)應(yīng)的頁(yè)面的js中進(jìn)行業(yè)務(wù)接口調(diào)用宋梧,從調(diào)用方式可以看到,第一個(gè)then里面定義了第一個(gè)getBusInfoPromise接口調(diào)用的resolve處理函數(shù)狰挡,因?yàn)榈诙€(gè)接口getBusStopListPromise依賴(lài)于第一個(gè)接口捂龄,所以在第一個(gè)接口的resolve的方法中調(diào)用了getBusStopListPromise方法并將Promise對(duì)象返回,在第二個(gè)then中定義resolve的處理方法加叁,如果還有第三個(gè)接口依賴(lài)倦沧,那么調(diào)用方式類(lèi)似。這樣是不是很好的解決了回調(diào)重重嵌套的問(wèn)題它匕。

//  記得引用
//const service = require('../../utils/service.js');
    service.getBusInfoPromise(this.data.page).then(res => {
   // res.data  j就是請(qǐng)求到的數(shù)據(jù)
  // --下面--分頁(yè)邏輯----
   if (res.data.result.length == 0) {
        wx.showToast({
          title: '沒(méi)有更多了',
        })
        return false;
      }
      var result = res.data.result;

      if (this.data.page > 1) {
        result = this.data.result.concat(res.data.result);
      }

      this.setData({
        result: result,
      })
    });

附:es6-promise.min.js 的地址:
https://github.com/fsi000041/es6-promise.min.js/blob/master/es6-promise.min.js

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末展融,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子豫柬,更是在濱河造成了極大的恐慌告希,老刑警劉巖扑浸,帶你破解...
    沈念sama閱讀 222,104評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異燕偶,居然都是意外死亡喝噪,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)指么,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)仙逻,“玉大人,你說(shuō)我怎么就攤上這事涧尿。” “怎么了檬贰?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,697評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵姑廉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我翁涤,道長(zhǎng)桥言,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,836評(píng)論 1 298
  • 正文 為了忘掉前任葵礼,我火速辦了婚禮号阿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘鸳粉。我一直安慰自己扔涧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,851評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布届谈。 她就那樣靜靜地躺著枯夜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪艰山。 梳的紋絲不亂的頭發(fā)上湖雹,一...
    開(kāi)封第一講書(shū)人閱讀 52,441評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音曙搬,去河邊找鬼摔吏。 笑死,一個(gè)胖子當(dāng)著我的面吹牛纵装,可吹牛的內(nèi)容都是我干的征讲。 我是一名探鬼主播,決...
    沈念sama閱讀 40,992評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼搂擦,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼稳诚!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起瀑踢,我...
    開(kāi)封第一講書(shū)人閱讀 39,899評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤扳还,失蹤者是張志新(化名)和其女友劉穎才避,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體氨距,經(jīng)...
    沈念sama閱讀 46,457評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡桑逝,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,529評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了俏让。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片楞遏。...
    茶點(diǎn)故事閱讀 40,664評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖首昔,靈堂內(nèi)的尸體忽然破棺而出寡喝,到底是詐尸還是另有隱情,我是刑警寧澤勒奇,帶...
    沈念sama閱讀 36,346評(píng)論 5 350
  • 正文 年R本政府宣布预鬓,位于F島的核電站,受9級(jí)特大地震影響赊颠,放射性物質(zhì)發(fā)生泄漏格二。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,025評(píng)論 3 334
  • 文/蒙蒙 一竣蹦、第九天 我趴在偏房一處隱蔽的房頂上張望顶猜。 院中可真熱鬧,春花似錦痘括、人聲如沸长窄。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,511評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)抄淑。三九已至,卻和暖如春驰后,著一層夾襖步出監(jiān)牢的瞬間肆资,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,611評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工灶芝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留郑原,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,081評(píng)論 3 377
  • 正文 我出身青樓夜涕,卻偏偏與公主長(zhǎng)得像犯犁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子女器,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,675評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • Promise 對(duì)象 Promise 的含義 Promise 是異步編程的一種解決方案酸役,比傳統(tǒng)的解決方案——回調(diào)函...
    neromous閱讀 8,710評(píng)論 1 56
  • 一、Promise的含義 Promise在JavaScript語(yǔ)言中早有實(shí)現(xiàn),ES6將其寫(xiě)進(jìn)了語(yǔ)言標(biāo)準(zhǔn)涣澡,統(tǒng)一了用法...
    Alex灌湯貓閱讀 828評(píng)論 0 2
  • 原文地址:http://es6.ruanyifeng.com/#docs/promise Promise 的含義 ...
    AI云棧閱讀 882評(píng)論 0 7
  • 目錄:Promise 的含義基本用法Promise.prototype.then()Promise.prototy...
    BluesCurry閱讀 1,494評(píng)論 0 8
  • Promiese 簡(jiǎn)單說(shuō)就是一個(gè)容器贱呐,里面保存著某個(gè)未來(lái)才會(huì)結(jié)束的事件(通常是一個(gè)異步操作)的結(jié)果,語(yǔ)法上說(shuō)入桂,Pr...
    雨飛飛雨閱讀 3,361評(píng)論 0 19