最近做小程序在调用后台接口的时候感觉总写很长一串,很冗杂。非常想念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. Pandas 库之 DataFrame

    How to use DataFrame ? 简介 创建 DataFrame 查看与筛选数据:行列选取 DataFrame 数据操作:增删改 一.About DataFrame DataFrame 是 ...

  2. WebSphere MQ性能调优浅谈

    导读:目前随着我们在中国的WebSphere MQ(MQSeries)用户数量越来越多,越来越多的用户开始对MQ使用时的性能优化问题提出要求,我根据日常积累的经验谈一谈在MQ性能优化方面应该考虑的因素 ...

  3. VS调试时修改代码

    最近碰到一个问题,就是vs在调试模式下无法修改代码之后再继续,这种严重影响工作效率的问题怎么能忍,所以决心把这个坑填满.网上搜了大堆有头无尾有尾无头的答案,我一个一个试了几乎都没啥用.最后通过不断的测 ...

  4. Vue中拆分视图层代码的5点建议

    目录 一.框架的定位 二. Vue开发中的script拆分优化 1.组件划分 2.剥离业务逻辑代码 3. 剥离数据转换代码 4. 善用computed和filters处理数据展示 5. 使用direc ...

  5. (十七)c#Winform自定义控件-基类窗体

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  6. (转载)分享常用的GoLang包工具

    分享常用的GoLang包工具 包名 链接地址 备注 Machinery异步队列 https://github.com/RichardKnop/machinery Mqtt通信 github.com/e ...

  7. sql server 怎么查看blocked的线程

    select spid ,blocked from master..sysprocesses

  8. js设置,取得,清除cookie

    //取得cookie function getCookie(name) {  var nameEQ = name + "=";  var ca = document.cookie. ...

  9. Flink中watermark为什么选择最小一条(源码分析)

    昨天在社区群看到有人问,为什么水印取最小的一条?这里分享一下自己的理解 首先水印一般是设置为:(事件时间 - 指定的值)  这里的作用是解决迟到数据的问题,从源码来看一下它如何解决的 先来看下wind ...

  10. pip安装ansible的过程

    我的python环境已经搭好了pip,可以用pip直接安装. 1.首先要安装基础环境: 1)yum install gcc glibc-devel zlib-devel rpm-build opens ...