微信小程序网络层封装的实现(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 相关文章推荐
Javascript中的this绑定介绍
Sep 22 Javascript
从面试题学习Javascript 面向对象(创建对象)
Mar 30 Javascript
jQery使网页在显示器上居中显示适用于任何分辨率
Jun 09 Javascript
jquery实现类似淘宝星星评分功能有截图
Sep 15 Javascript
javascript中checkbox使用方法简单实例演示
Nov 17 Javascript
JavaScript:Date类型全面解析
May 19 Javascript
原生js封装的一些jquery方法(详解)
Sep 20 Javascript
ionic环境配置及问题详解
Jun 27 Javascript
使用travis-ci如何持续部署node.js应用详解
Jul 30 Javascript
详解用函数式编程对JavaScript进行断舍离
Sep 18 Javascript
JS实现在文本指定位置插入内容的简单示例
Dec 22 Javascript
jQuery+ajax实现动态添加表格tr td功能示例
Apr 23 jQuery
详解微信小程序的不同函数调用的几种方法
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如何得到当前页和上一页的地址?
2006/11/27 PHP
PHP下编码转换函数mb_convert_encoding与iconv的使用说明
2009/12/16 PHP
php替换字符串中间字符为省略号的方法
2015/05/04 PHP
php实现文章置顶功能的方法
2016/10/20 PHP
Javascript实现的鼠标经过时播放声音
2010/05/18 Javascript
javascript下利用arguments实现string.format函数
2010/08/24 Javascript
angular+ionic 的app上拉加载更新数据实现方法
2017/01/16 Javascript
vue.js组件之间传递数据的方法
2017/07/10 Javascript
js HTML5 canvas绘制图片的方法
2017/09/08 Javascript
基于vue写一个全局Message组件的实现
2019/08/15 Javascript
Egg Vue SSR 服务端渲染数据请求与asyncData
2019/11/24 Javascript
解决vue-router 嵌套路由没反应的问题
2020/09/22 Javascript
ReactRouter的实现方法
2021/01/25 Javascript
Django URL传递参数的方法总结
2016/08/28 Python
python实现一个简单的并查集的示例代码
2018/03/19 Python
利用matplotlib实现根据实时数据动态更新图形
2019/12/13 Python
Python使用urllib模块对URL网址中的中文编码与解码实例详解
2020/02/18 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python用类实现扑克牌发牌的示例代码
2020/06/01 Python
通过实例解析python创建进程常用方法
2020/06/19 Python
python右对齐的实例方法
2020/07/05 Python
python中Django文件上传方法详解
2020/08/05 Python
非常震撼的纯CSS3人物行走动画
2016/02/24 HTML / CSS
使用HTML5做的导航条详细步骤
2020/10/19 HTML / CSS
幼儿园教师考核制度
2014/02/01 职场文书
物流业务员岗位职责
2014/02/08 职场文书
大一新生学期自我评价
2014/04/09 职场文书
竞选学习委员演讲稿
2014/09/01 职场文书
文员试用期转正自我鉴定
2014/09/14 职场文书
志愿者事迹材料
2014/12/26 职场文书
英语专业毕业论文答辩开场白
2015/05/27 职场文书
Python快速实现一键抠图功能的全过程
2021/06/29 Python
Python实现老照片修复之上色小技巧
2021/10/16 Python
python 详解turtle画爱心代码
2022/02/15 Python
angular异步验证器防抖实例详解
2022/03/31 Javascript
Java实现简单小画板
2022/06/10 Java/Android