最近做小程序在调用后台接口的时候感觉总写很长一串,很冗杂。非常想念vue中promise封装的写法,于是自己初步封装了一下。

1.url 接口地址

2.headers请求头

3. params 请求参数

4.host 服务端地址

/** 字符串化 */
export function stringifyQuery(query){
let arr = [];
for (let key in query) {
let value = query[key];
if (value == null) continue;
arr.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
}
return arr.join("&");
}
resolveUrl(path){
if(path.startsWith("http://") || path.startsWith("https://")){
return path;
}
return host + path;
}
checkResponseStatus(response){
if(!response.data) throw response;
let message = response.data.message || "";
let code = response.data.code;
if (code == 200)
return response.data;
let err = Object.create(new Error(message));
err.type = "apiResponseStatusError"; /** 兼容 wx Error 结构 */
err.errMsg = message;
/** 代码中使用 code 判断不同错误状态 */
err.code = code;
/** 代码中使用 res 获取 code 不为 200 时的响应内容 */
err.res = response.data; throw err;
}
apiRequest(option){
let resolve, reject;
let promise = new Promise((s,j)=>{
resolve = s
reject = j
})
let defaultHeader = {}
let heard = option.headers = Object.assign({}, option.header, defaultHeader);
option.headers = option.header
let headerParam = stringifyQuery(header)
option.url += option.url.includes("?")
? "&" + headerParam : headerParam? "?" + headerParam : "";
let proxySuccess = function(res){
let response = res.data;
let header = res.header;
let httpStatus = res.statusCode;
let status = response.status;
return resolve(res);
}
let proxyFail = function(err){
let msg = err.errMsg;
if(msg && msg.includes("max connected")){
option._retryCount = (option._retryCount || 0) + 1;
option._retryCount > 4
? reject(err)
: setTimeout(_ => uni.request(option), 300);
return;
}
if(msg && msg.includes("request:fail")){
let e = new Error("请求失败, 请检查网络")
e.innerError = err;
err = e;
}
if(msg && msg.includes("fail to connect")){
let e = new Error("连接失败, 稍后再试")
e.innerError = err;
err = e;
}
reject(err);
}
option.success = proxySuccess;
option.fail = proxyFail;
option.complete = proxyComplete;
wx.request(option);
return promise;
}

POST:

post(path){
let getApi = data =>
apiRequest({
url:resolveUrl(path),
data: data
})
.then(checkResponseStatus);
getApi.path = path;
return getApi;
}

GET:

get(path){
let getApi = data =>
apiRequest({
url:resolveUrl(path),
data: data
})
.then(checkResponseStatus);
getApi.path = path;
return getApi;
}

到这儿呢就结束了,就可以愉快的通过then来取回调了。

当然在这里还可以做错误统一处理,我这儿只是简单的做了封装,有兴趣的小伙伴可以进一步封装。

本人小白,如有错误欢迎指正批评。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

小程序 请求Promise简单封装的更多相关文章

  1. 小程序请求接口统一封装到一个js文件中

    在我们做小程序时,数据请求数据请求是避免不了的,然而我们用官方自带的请求方式,会给我们带来很多重复的工作,所以我就借鉴大神们的博客,写了一个简单的请求方式. 1.首先我们在utils中新建一个api. ...

  2. 基于小程序请求接口 wx.request 封装的类 axios 请求

    基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...

  3. 小程序wx.request的封装

    第一次做小程序项目,这个封装方法是同学推荐的一个网址,对我帮助很大,如果想看代码部分,请看网址详细介绍 网络请求都写在Page里,每个请求都要重复的写wx.request以及一些基础配置: 每个页面里 ...

  4. 微信小程序请求数据

    微信小程序请求数据,在页面展示,可以在onLoad生命周期中进行请求. 1.新建目录http,新建文件http.js 2.在js文件中暴露需要使用的变量 var baseUrl = 'http://1 ...

  5. 微信小程序 wxs的简单应用

    Demo地址:微信小程序wxs的简单应用 案例分析 张三.李四.王五,各自分别都有数量不等的车,现在需要列表显示名字及他们拥有车的数量, list数据结构如下,当我们使用wx:for进行显示时,发现个 ...

  6. 小程序使用 Promise.all 完成文件异步上传

    小程序使用 Promise.all 完成文件异步上传 extends [微信小程序开发技巧总结(二) -- 文件的选取.移动.上传和下载 - Kindear - 博客园 (cnblogs.com)] ...

  7. 【转】Unity中的协同程序-使用Promise进行封装(三)

    原文:http://gad.qq.com/program/translateview/7170967 译者:崔国军(飞扬971)    审校:王磊(未来的未来) 在这个系列的最后一部分文章,我们要通过 ...

  8. 微信小程序“一劳永逸”的接口封装

    前言 最近都在研究小程序了,我可以的! 需求 之前都是用vue来开发项目的,接口模块我特意封装了一下.感觉也可以记录一下 小程序的接口虽说简单,但是重复调用那么多,显得不专业(一本正经的胡说八道) 还 ...

  9. 微信小程序中promise的使用

    简介 相信看到这篇文章的同学,都已经对微信小程序的api文档有所了解了,也都经历了微信小程序api回调函数嵌套的痛苦,才会想要通过Promise解决回调地狱这个问题,我下面就直接介绍怎么在小程序中使用 ...

随机推荐

  1. iView 实现可编辑表格

    create at: 2019-02-20 组件 <i-table highlight-row ref="currentRowTable" :columns="co ...

  2. [转载]MongoDB管理基础

    1.  启动和停止MongoDB: 执行mongod命令启动MongoDB服务器.mongod有很多可配置的选项,我们通过mongod --help可以查看所有选项,这里仅介绍一些主要选项:    - ...

  3. android ——网络编程

    一.WebView 这个View就是一个浏览器,用于展示网页的. 布局文件: <LinearLayout xmlns:android="http://schemas.android.c ...

  4. 解读 PHP 的 P++提案

    解读 PHP 的 P++提案 周末看到一篇文章说 PHP 创始人提议将 PHP 拉出新分支,创建 P++ 语言.随后阅读了一下 Zeev Suraski 发起的这个邮件列表,大致了解了一下,这里做个解 ...

  5. Excel批量导入(导出同理)

    在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这 ...

  6. 本地在不安装Oracle的情况下安装PLSQL客户端

    本文解决问题:   通常在本地安装PLSQL后,如果本地没有安装Oracle数据库的话,PLSQL是不能使用的,输入远程数据库登录信息会提示:"Oracle Client没有正确安装&quo ...

  7. 建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期

    ​团队开发时,每天都需要输出一个apk包给其它部门的同事测试验证.打包几乎是每天必须完成的功课.如果用IDE来输出apk,那速度是非常慢的,如果还需要有不同渠道的apk包,那程序猿都要疯了.当然也有用 ...

  8. [HNOI2008]玩具装箱toy(斜率优化dp)

    前言 这是我写的第一道$dp$斜率优化的题目,$dp$一直都很菜,而且咖啡鸡都说了这是基础的东西,然而看别人对$dp$斜率优化一大堆公式又看不懂就老老实实做几道题目,这个比较实在 描述 给出$n$和$ ...

  9. 七缸发动机预热,docker swarm + .net core 高速飙车成功

    (图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...

  10. CSS 之Grid网格大致知识梳理1

    CSS所提供的关于网格Grid属性让我们可以更方便编写页面以及布局,而它的一些主要应用属性如下: 1.将父容器的display属性值设置为grid 即可将其转换为网格容器: 2.在网格容器中添加列的属 ...