微信小程序网络层封装的实现(promise, 登录锁)


Posted in Javascript onMay 08, 2019

一、对小程序的request的封装

写过小程序的应该知道,微信的request不封装基本上不能用,写的显的太冗长,而且是回调式的,回调地狱什么的就不说了,可读性差。

下面是我的封装代码,顺便支持一下promise。

function baseRequest({ url, method, header, data, complete }, resolve, reject) {
 wx.request({
 url,
 method,
 header,
 data,
 success: function (res) {
  // 需要判断服务器code的用这一段
  // 我司服务器返回0表示真正的成功,其他code表示各种错误码
  // 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. 将上面的代码写到一个独立的文件里,我的命名为network.js。

2. 然后将其绑定到全局的 wx 对象身上。 wx.Network = require('./network.js')。(在app.js里面绑定)

3. 实例如下

wx.Network.get({
 url: 'xxx.xxx.xxx', // 请求路径
 data: {
  a: "a" // 参数列表
 }
 }).then(res => {
  console.log("请求成功")
 }).catch(res => {
  console.log("请求失败") 
 })

二、登录锁

基本的request请求封装完了后,还有一些特殊的需求,比如

1. 在首页我会进行登录, 登录后获得token, 然后我拿着token去请求其他需要token才可以请求的接口 (比如个人购物信息)

2. 这个时候一种做法是登录完成前不进行需要token的请求,并且有蒙板进行拦截操作(正在登录ing...)

3. 对于我公来说这种方法有一个致命的弊端,就是在高并发的情况下,服务器的压力很大,首页的登录接口很慢才有返回(进首页即自动登录),这个时候,用户看到的界面就是loading,而且可能时间比较长,如果用户对你的产品粘性不高,绝大部分人直接就走了

4. 为了优化这种情况下的用户体验,我们全面取消了登录的loading,替换成了“登录锁”的形式

5. 效果为未登录调用需要token的接口时,不请求,直到登录完成后才会请求

6. 即如果这个请求需要token,那么先判断有没有登录,如果没有登录,启动定时器一段时间后(200ms),再次判断,如果已经登录,发出请求,如果没有,重复以上操作

加了登录锁后的代码如下: ( 添加了新的 wait 函数,调用get,post,put时增加第二个参数,表示是否需要token )

function baseRequest({ url, method, header, data, complete }, resolve, reject) {
 wx.request({
 url,
 method,
 header,
 data,
 success: function (res) {
  // 需要判断服务器code的用这一段
  // 我司服务器返回0表示真正的成功,其他code表示各种错误码
  // 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
}

如何使用:(使用方式和上面一样,只是调用的时候多一个参数)

1. 将上面的代码写到一个独立的文件里,我的命名为network.js。

2. 然后将其绑定到全局的 wx 对象身上。 wx.Network = require('./network.js')。(在app.js里面绑定)

3. 实例如下

wx.Network.get({
 url: 'xxx.xxx.xxx', // 请求路径
 data: {
  a: "a" // 参数列表
 }
 }, true // 增加第二个参数,true表示需要token, false表示不需要
 ).then(res => {
  console.log("请求成功")
 }).catch(res => {
  console.log("请求失败") 
 })

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery select的操作实现代码
May 06 Javascript
Prototype String对象 学习
Jul 19 Javascript
javascript中的prototype属性使用说明(函数功能扩展)
Aug 16 Javascript
jquery动态增加text元素以及删除文本内容实例代码
Jul 01 Javascript
使用jquery写个更改表格行顺序的小功能
Apr 29 Javascript
Node.js编码规范
Jul 14 Javascript
AngularJs bootstrap搭载前台框架——基础页面
Sep 01 Javascript
Bootstrap中的fileinput 多图片上传及编辑功能
Sep 05 Javascript
基于jQuery的checkbox全选问题分析
Nov 18 Javascript
javascript设计模式之模块模式学习笔记
Feb 15 Javascript
electron-vue开发环境内存泄漏问题汇总
Oct 10 Javascript
js绘制一条直线并旋转45度
Aug 21 Javascript
详解微信小程序的不同函数调用的几种方法
May 08 #Javascript
微信小程序Page中data数据操作和函数调用方法
May 08 #Javascript
vue中使用props传值的方法
May 08 #Javascript
vue权限问题的完美解决方案
May 08 #Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
May 08 #Javascript
微信小程序事件对象中e.target和e.currentTarget的区别详解
May 08 #Javascript
利用原生JavaScript实现造日历轮子实例代码
May 08 #Javascript
You might like
PHP读取RSS(Feed)简单实例
2014/06/12 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
php HTML无刷新提交表单
2016/04/05 PHP
phpstudy隐藏index.php的方法
2020/09/21 PHP
js cookies实现简单统计访问次数
2009/11/24 Javascript
Javascript获取统一管理的提示语(message)
2016/02/03 Javascript
Web性能优化系列 10个提升JavaScript性能的技巧
2016/09/27 Javascript
Vue导出json数据到Excel电子表格的示例
2017/12/04 Javascript
Angularjs过滤器实现动态搜索与排序功能示例
2017/12/13 Javascript
VUE 全局变量的几种实现方式
2018/08/22 Javascript
vue动画打包后失效问题的解决方法
2018/09/18 Javascript
微信小程序-可移动菜单的实现过程详解
2019/06/24 Javascript
js利用递归与promise 按顺序请求数据的方法
2019/08/30 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
python使用matplotlib绘制折线图教程
2017/02/08 Python
Python从使用线程到使用async/await的深入讲解
2018/09/16 Python
python SocketServer源码深入解读
2019/09/17 Python
python函数装饰器之带参数的函数和带参数的装饰器用法示例
2019/11/06 Python
Python sep参数使用方法详解
2020/02/12 Python
python实现udp聊天窗口
2020/03/31 Python
django教程如何自学
2020/07/31 Python
10张动图学会python循环与递归问题
2021/02/06 Python
最便宜促销价格订机票:Airpaz(总部设在印尼,支持中文)
2018/11/13 全球购物
意大利比基尼品牌:MISS BIKINI
2019/11/02 全球购物
六年级数学教学反思
2014/02/03 职场文书
应届生求职自荐信范文
2014/04/07 职场文书
教师党员岗位承诺书
2014/05/29 职场文书
软件工程毕业生自荐信
2014/07/04 职场文书
公司试用期员工自我评价
2014/09/17 职场文书
教师师德师风个人整改方案
2014/09/18 职场文书
2015年春训学习心得体会范文
2015/03/09 职场文书
试用期旷工辞退通知书
2015/04/17 职场文书
大学生读书笔记范文
2015/07/01 职场文书
小学毕业感言200字
2015/07/30 职场文书
热爱劳动主题班会
2015/08/14 职场文书
goland 设置project gopath的操作
2021/05/06 Golang