小程序网络请求的封装(二):引入promise进行封装

    在之前的文章里,我们封装过小程序的http网络请求,现在我们基于前一篇文章引入promise,进行再次封装。首先,我们要明白为什么要引入promise进行封装呢?上一篇文章我们获取网络请求的异步回调结果用的是callbck函数的方式。这样其实有一个很不好的现象,就是封装的每一层都要传入callback回调函数,而如果我们用promise的方式的话,是不用层层传入的,只要一直return到上一层,直到在page页面你需要回调结果了,再获取这个promise对象,再通过promise对象的then方法获取网络请求的结果。

  注:函数是不能保存状态的,而对象是能保存状态的,callcack是个回调函数,promise是个对象,所以callback方式需要层层传递,而promise方式不需要。

下面我们列出关键代码:

目录结构:


一、http基类http-p.js代码:


import {config} from '../config.js'

class HTTP{

  //结果返回一个Promise对象

  request(params){

        return new Promise((resolve, reject)=>{

          if (!params.method) {

            params.method = "POST"

          }

          wx.request({

            url: config.api_base_url + params.url,

            method: params.method,

            data: params.data,

            header: {

              "Content-Type": "application/x-www-form-urlencoded;text/html; charset=utf-8"

            },

            success: (res) => {

              let code = res.data.result

              if (code == "0000") {

                resolve(res.data)

              }

              else {

                reject()

                this._show_error(res.data.msg)

              }

            },

            fail: (err) => {

              reject()

              this._show_error("无法访问服务器");

            }

          })

        })

    }

  _show_error(msg) {

    wx.showToast({

      title: msg,

      icon: 'none',

      duration: 2000

    })

  }

}

export {HTTP}


二、具体网络请求类test-p.js


import {

  HTTP

}

  from '../util/http-p.js'

class TestPModel extends HTTP {

  getTest(code, providerId, providerKey) {


    return this.request({

      url: 'getOpenId.htm',

      data: {

        code: code,

        providerId: providerId,

        providerKey: providerKey

      }

    })

  }

}

export {

  TestPModel

}


三、page页面具体调用


import {

  TestPModel

} from '../../models/test-p.js'

const testModel = new TestModel()

const testPModel = new TestPModel()

Page({

  /**

  * 页面的初始数据

  */

  data: {

  },

  /**

  * 生命周期函数--监听页面加载

  */

  onLoad: function (options) {

    testPModel.getTest("param1", "param2", "param3")

      .then((res) => {


      })


  },



用promise封装也可以解决回调地狱的问题:

比如现在我们有多个网络请求,这几个网络请求是存在链式关系的,就是必须第一个网络请求完才能进行第二个、再第三个、第四个。。。。,如果我们用callback的形式进行封装,会出现如下图的结果:

回调地狱图示

但我们如果用promise进行网络请求:


这样每个网络请求是平行的,所以解决了回调地狱的问题。


Promise.all的使用:

1、test1和test2返回为一个数组,并且test1为数组的第一项,test2为数组的第二项,

2、test1和test2请求结束后才会进行test3的请求。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,392评论 5 470
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,258评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,417评论 0 332
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,992评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,930评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,199评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,652评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,327评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,463评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,382评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,432评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,118评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,704评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,787评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,999评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,476评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,057评论 2 341