最近做小程序在调用后台接口的时候感觉总写很长一串,很冗杂。非常想念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. java并发编程(十六)----(线程池)java线程池的使用

    上节我们简单介绍了线程池,这次我们就来使用一下.Executors提供四种线程池,分别是:newCachedThreadPool,newFixedThreadPool ,newScheduledThr ...

  2. 算法与数据结构基础 - 双指针(Two Pointers)

    双指针基础 双指针(Two Pointers)是面对数组.链表结构的一种处理技巧.这里“指针”是泛指,不但包括通常意义上的指针,还包括索引.迭代器等可用于遍历的游标. 同方向指针 设定两个指针.从头往 ...

  3. Java后台解决跨域问题

    首先说一下什么是跨域? JavaScript出于安全方面的考虑,不允许跨域调用其他页面的对象.那什么是跨域呢,简单地理解就是因为JavaScript同源策略的限制,a.com域名下的js无法操作b.c ...

  4. html页面中关于按钮type的要求

    重要事项:如果在 HTML 表单中使用 button 元素,不同的浏览器会提交不同的值.Internet Explorer 将提交 <button> 与 </button> 之 ...

  5. Groovy语法基础

    Groovy 简介 Groovy 是一种基于 JVM 的动态语言,他的语法和 Java 相似,最终也是要编译 .class 在JVM上运行. Groovy 完全兼容 Java 并且在此基础上添加了很多 ...

  6. js页面reload问题

    form表单提交时,action="url" method="get/post" 当ajax提交表单时,原本的ajax post提交  success后  不能 ...

  7. spring security中@PreAuthorize注解的使用

    添加依赖<!-- oauth --><dependency> <groupId>org.springframework.cloud</groupId> ...

  8. Kafka到底有几个Offset?——Kafka核心之偏移量机制

    ​ Kafka是由LinkIn开源的实时数据处理框架,目前已经更新到2.3版本.不同于一般的消息中间件,Kafka通过数据持久化和磁盘读写获得了极高的吞吐量,并可以不依赖Storm,SparkStre ...

  9. react native Android支持gif和WebP动图

    在项目android/app/build.gradle的文件中找到dependencies 支持gif动图加入: implementation 'com.facebook.fresco:animate ...

  10. Oracle笔记_查询

    1 单条件查询 select -- from -- where 条件 -- = > >= < <= != <> -- 单引号用于数据表示字符串 -- 双引号用于数据 ...