微信小程序网络层封装的实现(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 相关文章推荐
原生js实现改变随意改变div属性style的名称和值的结果
Sep 26 Javascript
JavaScript中实现键值对应的字典与哈希表结构的示例
Jun 12 Javascript
AngularJs Understanding the Model Component
Sep 02 Javascript
Javascript中this绑定的3种方法与比较
Oct 13 Javascript
使用JS正则表达式 替换括号,尖括号等
Nov 29 Javascript
浅谈Vue数据响应
Nov 05 Javascript
微信小程序实现发送验证码按钮效果
Dec 20 Javascript
react-native滑动吸顶效果的实现过程
Jun 03 Javascript
基于layui框架响应式布局的一些使用详解
Sep 16 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
Oct 11 Javascript
JS数组属性去重并校验重复数据
Jan 10 Javascript
vue中路由跳转不计入history的操作
Sep 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文件操作实现代码分享
2011/09/01 PHP
学习php设计模式 php实现桥梁模式(bridge)
2015/12/07 PHP
PHP的微信支付接口使用方法讲解
2019/03/08 PHP
比较简单实用的使用正则三种版本的js去空格处理方法
2007/11/18 Javascript
javascript 解决表单仍然提交即使监听处理函数返回false
2010/03/14 Javascript
浅析javascript闭包 实例分析
2010/12/25 Javascript
使用js判断TextBox控件值改变然后出发事件
2014/03/07 Javascript
angularjs中的e2e测试实例
2014/12/06 Javascript
JavaScript事件委托技术实例分析
2015/02/06 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
微信小程序 九宫格实例代码
2017/01/21 Javascript
js 获取图像缩放后的实际宽高,位置等信息
2017/03/07 Javascript
关于vue-router的beforeEach无限循环的问题解决
2017/09/09 Javascript
详解vue中引入stylus及报错解决方法
2017/09/22 Javascript
Nuxt.js实战详解
2018/01/18 Javascript
vue中添加mp3音频文件的方法
2018/03/02 Javascript
vue 内置过滤器的使用总结(附加自定义过滤器)
2018/12/11 Javascript
TypeScript中使用getElementXXX()的示例代码
2019/09/12 Javascript
图解NodeJS实现登录注册功能
2019/09/16 NodeJs
Vue数字输入框组件的使用方法
2019/10/19 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
Python3中的2to3转换工具使用示例
2015/06/12 Python
Python使用回溯法子集树模板解决爬楼梯问题示例
2017/09/08 Python
python正则表达式之对号入座篇
2018/07/24 Python
Python3 A*寻路算法实现方式
2019/12/24 Python
Python代码一键转Jar包及Java调用Python新姿势
2020/03/10 Python
Python3 requests模块如何模仿浏览器及代理
2020/06/15 Python
python 常用日期处理-- datetime 模块的使用
2020/09/02 Python
Canvas中设置width与height的问题浅析
2018/11/01 HTML / CSS
师范生个人推荐信
2013/11/29 职场文书
晚宴邀请函范文
2014/01/15 职场文书
职务任命书范本
2014/06/05 职场文书
大学生见习报告范文
2014/11/03 职场文书
绿里奇迹观后感
2015/06/15 职场文书
防溺水安全教育主题班会
2015/08/12 职场文书
Python标准库pathlib操作目录和文件
2021/11/20 Python