小程序 请求Promise简单封装
最近做小程序在调用后台接口的时候感觉总写很长一串,很冗杂。非常想念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简单封装的更多相关文章
- 小程序请求接口统一封装到一个js文件中
在我们做小程序时,数据请求数据请求是避免不了的,然而我们用官方自带的请求方式,会给我们带来很多重复的工作,所以我就借鉴大神们的博客,写了一个简单的请求方式. 1.首先我们在utils中新建一个api. ...
- 基于小程序请求接口 wx.request 封装的类 axios 请求
基于小程序请求接口 wx.request 封装的类 axios 请求 Introduction wx.request 的配置.axios 的调用方式 源码戳我 feature 支持 wx.reques ...
- 小程序wx.request的封装
第一次做小程序项目,这个封装方法是同学推荐的一个网址,对我帮助很大,如果想看代码部分,请看网址详细介绍 网络请求都写在Page里,每个请求都要重复的写wx.request以及一些基础配置: 每个页面里 ...
- 微信小程序请求数据
微信小程序请求数据,在页面展示,可以在onLoad生命周期中进行请求. 1.新建目录http,新建文件http.js 2.在js文件中暴露需要使用的变量 var baseUrl = 'http://1 ...
- 微信小程序 wxs的简单应用
Demo地址:微信小程序wxs的简单应用 案例分析 张三.李四.王五,各自分别都有数量不等的车,现在需要列表显示名字及他们拥有车的数量, list数据结构如下,当我们使用wx:for进行显示时,发现个 ...
- 小程序使用 Promise.all 完成文件异步上传
小程序使用 Promise.all 完成文件异步上传 extends [微信小程序开发技巧总结(二) -- 文件的选取.移动.上传和下载 - Kindear - 博客园 (cnblogs.com)] ...
- 【转】Unity中的协同程序-使用Promise进行封装(三)
原文:http://gad.qq.com/program/translateview/7170967 译者:崔国军(飞扬971) 审校:王磊(未来的未来) 在这个系列的最后一部分文章,我们要通过 ...
- 微信小程序“一劳永逸”的接口封装
前言 最近都在研究小程序了,我可以的! 需求 之前都是用vue来开发项目的,接口模块我特意封装了一下.感觉也可以记录一下 小程序的接口虽说简单,但是重复调用那么多,显得不专业(一本正经的胡说八道) 还 ...
- 微信小程序中promise的使用
简介 相信看到这篇文章的同学,都已经对微信小程序的api文档有所了解了,也都经历了微信小程序api回调函数嵌套的痛苦,才会想要通过Promise解决回调地狱这个问题,我下面就直接介绍怎么在小程序中使用 ...
随机推荐
- iView 实现可编辑表格
create at: 2019-02-20 组件 <i-table highlight-row ref="currentRowTable" :columns="co ...
- [转载]MongoDB管理基础
1. 启动和停止MongoDB: 执行mongod命令启动MongoDB服务器.mongod有很多可配置的选项,我们通过mongod --help可以查看所有选项,这里仅介绍一些主要选项: - ...
- android ——网络编程
一.WebView 这个View就是一个浏览器,用于展示网页的. 布局文件: <LinearLayout xmlns:android="http://schemas.android.c ...
- 解读 PHP 的 P++提案
解读 PHP 的 P++提案 周末看到一篇文章说 PHP 创始人提议将 PHP 拉出新分支,创建 P++ 语言.随后阅读了一下 Zeev Suraski 发起的这个邮件列表,大致了解了一下,这里做个解 ...
- Excel批量导入(导出同理)
在做JavaWeb中添加数据使我们在所难免会遇到的,在大数据的环境下批量添加和批量删除是必须的,而批量删除只需要获取到我们需要删除的ID就可以了,在批量添加中我们就会遇到问题,问题是得到批量的数据,这 ...
- 本地在不安装Oracle的情况下安装PLSQL客户端
本文解决问题: 通常在本地安装PLSQL后,如果本地没有安装Oracle数据库的话,PLSQL是不能使用的,输入远程数据库登录信息会提示:"Oracle Client没有正确安装&quo ...
- 建立apk定时自动打包系统第一篇——Ant多渠道打包并指定打包目录和打包日期
团队开发时,每天都需要输出一个apk包给其它部门的同事测试验证.打包几乎是每天必须完成的功课.如果用IDE来输出apk,那速度是非常慢的,如果还需要有不同渠道的apk包,那程序猿都要疯了.当然也有用 ...
- [HNOI2008]玩具装箱toy(斜率优化dp)
前言 这是我写的第一道$dp$斜率优化的题目,$dp$一直都很菜,而且咖啡鸡都说了这是基础的东西,然而看别人对$dp$斜率优化一大堆公式又看不懂就老老实实做几道题目,这个比较实在 描述 给出$n$和$ ...
- 七缸发动机预热,docker swarm + .net core 高速飙车成功
(图片来源:Microsoft Blog) 上周五上午在我们将 .net core 博客站点由 docker swarm 自动驾驶改为 docker-compose 手动驾驶后,依然发生了翻车,意料之 ...
- CSS 之Grid网格大致知识梳理1
CSS所提供的关于网格Grid属性让我们可以更方便编写页面以及布局,而它的一些主要应用属性如下: 1.将父容器的display属性值设置为grid 即可将其转换为网格容器: 2.在网格容器中添加列的属 ...