美文网首页
小程序系列--网络库封装(五)

小程序系列--网络库封装(五)

作者: wan7451 | 来源:发表于2018-04-09 11:37 被阅读12次

使用请求队列

在实际的使用过程中,可能会出现同时有多个请求的并发问题,以及网络失败请求重试的问题。wx小程序主可以理解为一个轻量级的应用,不能有太多的并发操作,所以可以引入队列来控制并发,处理重试。

队列的主要是通过数组的末尾添加,首位截取的思想实现的。

var requestQueue = []; //请求队列
requestQueue.push(req);  //末尾添加请求
var req = requestQueue.shift();   //头部取出请求

接下来就可以创建发起请求的方法

function request(req) {
  req.repeatCount = 0; //记录重试次数
  req.isLoding = false; //请求是否显示laoding
  requestQueue.push(req); //将请求添加到队列中
  handleRequest(); //递归处理队列中的请求
}

//===============华丽分割线==================================
function handleRequest() {
  //取出队列第一个请求
  var req = requestQueue.shift();
  if (!req) return;

  if (DEBUG) {
    console.log("======>url:" + req.url);
    console.log("======>params:" + Obj2String(req.data));
    console.log("======>header:" + Obj2String(getHttpHeader()));
  }
  //是否展示loading
  if (!req.isLoding) {
    req.isLoding = true;
    wx.showLoading({
      title: ' ',
    });
  }
  //发起请求
  wx.request({
    url: req.url,
    data: req.data,
    header: getHttpHeader(),
    method: "POST",
    success: function (res) {
      if (DEBUG) {
        console.log("======>result:" + Obj2String(res.data));
        console.log("======>result:" + Obj2String(res.data.data));
      }
      var data = getResultData(res);
      if (data) {
        //请求成功
        wx.hideLoading();
        req.isLoding = false;
        req.success(data);
        //递归处理其他请求
        handleRequest();
      } else if (getResultCode(res) == -401) {
        //处理 -401
        relogin(req);
      } else if (req.repeatCount < REPEAT_COUNT) { //常量,最大的重试次数
        //加入队列再次请求,最多3次
        req.repeatCount++;
        requestQueue.push(req); //失败了重新加入队列进行重试
        //递归处理其他请求
        handleRequest();
      } else {
        //超出3次,显示错误处理
        wx.hideLoading();
        req.isLoding = false;
        handleError(res);
        if (isHostMethod(req, "fail")) {
          req.fail();
        }
      }

    },
    fail: function (res) {
      if (DEBUG) {
        console.log("======>error:" + res.errMsg);
      }
      if (req.repeatCount < REPEAT_COUNT) {
        //加入队列再次请求,最多3次
        req.repeatCount++;
        requestQueue.push(req); //失败了重新加入队列进行重试
        //递归处理其他请求
        handleRequest();
        return;
      }
      if (isHostMethod(req, "fail")) {
        req.fail(res.errMsg);
      }

      req.isLoding = false;
      wx.hideLoading();
      showErrorToast(res.errMsg);
    }

  })
}

gitHub源码

相关文章

网友评论

      本文标题:小程序系列--网络库封装(五)

      本文链接:https://www.haomeiwen.com/subject/duwbhftx.html