微信小程序网络层封装的实现(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资料prototype 属性
Mar 13 Javascript
javascript高亮效果的二种实现方法
Sep 14 Javascript
jQuery技巧大放送 学习jquery的朋友可以看下
Oct 14 Javascript
JavaScript 保存数组到Cookie的代码
Apr 14 Javascript
JavaScript中检测变量是否存在遇到的一些问题
Nov 11 Javascript
JsRender实用入门教程
Oct 31 Javascript
javascript实现动态表头及表列的展现方法
Jul 14 Javascript
js判断文本框输入的内容是否为数字
Dec 23 Javascript
浅谈javascript中的Function和Arguments
Aug 30 Javascript
jQuery插件fullPage.js实现全屏滚动效果
Dec 02 Javascript
如何快速上手Vuex
Feb 14 Javascript
移动端效果之IndexList详解
Oct 20 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中文本操作的类
2007/03/17 PHP
Thinkphp框架+Layui实现图片/文件上传功能分析
2020/02/07 PHP
php多进程并发编程防止出现僵尸进程的方法分析
2020/02/28 PHP
JS类定义原型方法的两种实现的区别评论很多
2007/09/12 Javascript
Javascript String对象扩展HTML编码和解码的方法
2009/06/02 Javascript
jquery ajax修改全局变量示例代码
2013/11/08 Javascript
jqplot通过ajax动态画折线图的方法及思路
2013/12/08 Javascript
javascript 3d 逐侦产品展示(核心精简)
2014/03/26 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
js实现div在页面拖动效果
2016/05/04 Javascript
BootStrap轻松实现微信页面开发代码分享
2016/10/21 Javascript
概述jQuery中的ajax方法
2016/12/16 Javascript
BootStrap数据表格实例代码
2017/09/13 Javascript
php 解压zip压缩包内容到指定目录的实例
2018/01/23 Javascript
通过vue写一个瀑布流插件代码实例
2019/09/07 Javascript
js回调函数仿360开机
2019/12/26 Javascript
写给新手同学的vuex快速上手指北小结
2020/04/14 Javascript
k8s node节点重新加入master集群的实现
2021/02/22 Javascript
[00:52]DOTA2国际邀请赛
2020/02/21 DOTA
python抓取网页中的图片示例
2014/02/28 Python
Python实现按照指定要求逆序输出一个数字的方法
2018/04/19 Python
Python全局锁中如何合理运用多线程(多进程)
2019/11/06 Python
最新pycharm安装教程
2020/11/18 Python
Python析构函数__del__定义原理解析
2020/11/20 Python
卡塔尔航空官方网站:Qatar Airways
2017/02/08 全球购物
Java基础知识面试要点
2016/07/29 面试题
如果一个类实现了多个接口但是这些接口有相同的方法名将会怎样
2013/06/16 面试题
什么是属性访问器
2015/10/26 面试题
班组长岗位职责范本
2014/01/05 职场文书
勤俭节约倡议书
2014/04/14 职场文书
个人合作协议书范本
2014/04/18 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
2015社区六五普法工作总结
2015/04/21 职场文书
2015年党员公开承诺事项
2015/04/27 职场文书
2015年机关后勤工作总结
2015/05/26 职场文书
java如何实现socket连接方法封装
2021/09/25 Java/Android