小程序 请求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解决回调地狱这个问题,我下面就直接介绍怎么在小程序中使用 ...
随机推荐
- Romantic HDU - 2669(扩欧)
#include<bits/stdc++.h> using namespace std; typedef long long LL; void gcd(LL a, LL b, LL &am ...
- linux100day(day4)--文本处理三剑客
在介绍三剑客之前,先来认识一下通配符和正则表达式 通配符 正则表达式 作用:通过一些特殊字符,来表示一类字符内容 1.字符匹配 . 任意一个字符 [ ] 范围内的任意一个字符 [^ ] 取 ...
- JAVA的初体验
jdk的地址:https://www.oracle.com/technetwork/java/javase/downloads/index.html 第一步:找到相应的JAVA SE版本,点击down ...
- npm命令无响应
npm命令完全无反应,不是加载的那种状态 而是下标不停地在哪里闪... 之后找解决方案,说要删除npmrc文件. 强调:不是nodejs安装目录npm模块下的那个npmrc文件 而是在C:\Users ...
- 2.php语言基础
HP简介 PHP超文本预处理器.是嵌入HTML文件中的服务器端脚本程序.换句话:PHP只能运行在服务器上. 一个HTML文件中,可以包含的代码:HTML代码.CSS代码.JS代码.PHP代码等. PH ...
- Go-json解码到接口及根据键获取值
Go-json解码到接口及根据键获取值 package main import ( "encoding/json" "fmt" "github.com ...
- 解决问题:安装Ubuntu时遇到nouveau sched_error问题
当我们在为有独立显卡gpu的电脑安装Ubuntu系统时,有可能会遇到nouveau sched_error问题. 方法一:安装系统时,开机出现dell图标时长按F12进入启动项选择界面, 然后选择UE ...
- 导入spark2.3.3源码至intellij idea
检查环境配置 maven环境 2.检查scala插件 没有的话可以到https://plugins.jetbrains.com/plugin/1347-scala/versions 下载与idea对应 ...
- php安装mongo扩展(linux)
1.首先下载php的mongodb扩展 从http://pecl.php.net/package/mongodb这个网址下载mongodb的扩展源码包 2.解压安装包 tar zxf mongodb- ...
- function template
/* function template programmer:qpz */ #include <iostream> using namespace std; template <c ...