技术标签: uni-app
根据官方文档,我们知道axios支持nodejs、浏览器环境,但不支持uniapp、小程序,所以要想在uniapp中使用axios就要自定义实现。axios文档对自定义实现,作了说明。
// `adapter` allows custom handling of requests which makes testing easier.
// Return a promise and supply a valid response (see lib/adapters/README.md).
adapter: function (config) {
/* ... */
},
翻译过来就是,要想自定义实现,就要覆盖adapter方法,默认实现如下
var settle = require('./../core/settle');
module.exports = function myAdapter(config) {
// At this point:
// - config has been merged with defaults
// - request transformers have already run
// - request interceptors have already run
// Make the request using config provided
// Upon response settle the Promise
return new Promise(function(resolve, reject) {
var response = {
data: responseData,
status: request.status,
statusText: request.statusText,
headers: responseHeaders,
config: config,
request: request
};
settle(resolve, reject, response);
// From here:
// - response transformers will run
// - response interceptors will run
});
}
settle.js中的代码
'use strict';
import AxiosError from './AxiosError.js';
/**
* Resolve or reject a Promise based on response status.
*
* @param {Function} resolve A function that resolves the promise.
* @param {Function} reject A function that rejects the promise.
* @param {object} response The response.
*
* @returns {object} The response.
*/
export default function settle(resolve, reject, response) {
const validateStatus = response.config.validateStatus;
if (!response.status || !validateStatus || validateStatus(response.status)) {
resolve(response);
} else {
reject(new AxiosError(
'Request failed with status code ' + response.status,
[AxiosError.ERR_BAD_REQUEST, AxiosError.ERR_BAD_RESPONSE][Math.floor(response.status / 100) - 4],
response.config,
response.request,
response
));
}
}
结合uniapp的api,可对axios如此封装
let count = 0
axios.defaults.adapter = function(config) {
//自己定义个适配器,用来适配uniapp的语法
count++
if (count == 1) {
uni.showLoading({
title: "加载中",
mask:true
})
}
return new Promise((resolve, reject) => {
var settle = require('axios/lib/core/settle');
var buildURL = require('axios/lib/helpers/buildURL');
uni.request({
method: config.method.toUpperCase(),
url: config.baseURL + config.url,
header: config.headers,
data: config.data,
dataType: config.dataType,
responseType: config.responseType,
sslVerify: config.sslVerify,
complete: function complete(response) {
count--
if (count == 0) {
uni.hideLoading()
}
if (response.data.code != 200) {
uni.showToast({
title: response.data.msg,
duration: 5000,
icon: 'none'
})
reject(response.data.msg)
return
}
response = {
data: response.data,
status: response.statusCode,
errMsg: response.errMsg,
header: response.header,
config: config
};
settle(resolve, reject, response);
}
})
})
}
我们不禁要问,直接用uni.request
封装请求不更简单吗?比如,
function request(data){
return new Promise((resolve,reject)=>{
uni.request({
data,
complete:function(response){
resolve(response);
}
})
})
}
这样做是可以,但没有了拦截器、baseUrl、参数转换等功能;基于axios封装,可以使用axios的api,比如拦截器。
// 添加请求拦截器
axios.interceptors.request.use(function (config) {
// 在发送请求之前做些什么
return config;
}, function (error) {
// 对请求错误做些什么
return Promise.reject(error);
});
// 添加响应拦截器
axios.interceptors.response.use(function (response) {
// 2xx 范围内的状态码都会触发该函数。
// 对响应数据做点什么
return response;
}, function (error) {
// 超出 2xx 范围的状态码都会触发该函数。
// 对响应错误做点什么
return Promise.reject(error);
});
文章浏览阅读3.6k次。2020/03/27 21:00:39 CLSRSC-184: Configuration of ASM failed2020/03/27 21:00:40 CLSRSC-258: Failed to configure and start ASMDied at /u01/app/19.0.0/grid/crs/install/crsinstall.pm line 2482.ORA-..._ora-39511: start of crs resource for instance '215' failed with error:[crs-2
文章浏览阅读3.4k次,点赞45次,收藏55次。对 W25Q64 的使用可以总结如下:初始化:在开始使用 W25Q64 之前,需要通过 SPI 总线初始化芯片,并确保硬件连接正确。读操作:可以使用读取数据函数从指定地址读取数据,并将数据存储到指定的缓冲区中。写操作:可以使用页写函数向指定地址写入数据。需要考虑到写入字节数大于 256 字节和不大于 256 字节的两种情况,以及在写入数据之前需要先执行写使能操作,并在写操作完成后等待芯片忙碌状态结束。其他操作:除了读写操作外,W25Q64 还支持擦除、写使能、禁止写等其他操作,根据具体需求进_w25q64
文章浏览阅读2.8w次,点赞16次,收藏61次。2015年11月23日,鄙人在csdn发表了第一篇技术文章,掐指一算距今已有三年。遥想当年开写博客,只是为了总结经验同时分享出来,后来机缘巧合受到出版社编辑邀请并出了书,完全是无心插柳的结果。当初写作《Android Studio开发实战:从零基础到App上线》第一版前后花了一年多的时间,经过三审三校于2017年6月正式上市,其实这本书出来之时没能赶上好时候,从2017年开始App学习热潮被人工智..._android studio开发实战:从零基础到app上线 第二版 pdf
文章浏览阅读2.8k次。习惯了使用notepad++,就知道它的好,尤其是当前文件过滤搜索,下文记录下ubuntu安装的心得。_ubuntu安装notepad
文章浏览阅读6.9k次,点赞44次,收藏326次。本篇博客包含ACM,NOIP所涉及的基础算法,涵盖七个模块:基础算法,数据结构,搜索与图论,STL,数学知识(数论),动态规划,贪心。涵盖内容范围较为全面,是面向初学者的算法汇总,第八个章节是所涉及的算法板子,可以直接使用。因为是面向算法竞赛,本文的所有设计算法都是用C++进行实现的,不提供其他语言的代码,共涉及106道算法题目,以题代讲,在题目中理解算法的内涵。_acm-icpc基本算法pdf
文章浏览阅读1.6k次。通信系统中ZF(Zero Forcing,零迫)、ML(Maximum Likelihood,最大似然)、MRC(Maximum Ratio Combining,最大比合并)和MMSE(Minimum Mean Square Error,最小均方误差)是四种常见的信号检测算法。这些算法在通信系统中用于从接收信号中恢复出原始发送信号。_mrc信号检测的缺点
文章浏览阅读201次。1qt5安装软件中心中安装 qt creater,此时Qt无法显示中文 且无法输入中文如果要设置中文等语言,还要下载一些语言文件。可以到http://qt-project.org上下载一个包,安装后把语言文件都复制到/usr/share/qtcreator/translations。2中文输入首先语言包要安装完整 系统设置 》语言设置中可以安装中文语言包下澡并安装 搜狗拼音输入法 for linu..._fcitx-frontend-qt5_1.0.5-1_amd64.deb
文章浏览阅读2.4k次。在sciter中,要给窗口弄个阴影是非常容易的事情 <html window-frame="solid-with-shadow">效果图 但是,在Windows 7下出问题了,变成这样了经过分析,发现是Windows 7主题引起的问题只有在使用了Aero主题的情况下,窗口才会出现阴影,否则就没有。最终,我还是放弃了这个方案,使用贴阴影图片..._rust窗口阴影
文章浏览阅读501次。随机相关内容 C#实现 Unity直接可用洗牌代码//Fisher-Yates shufflestatic void Shuffle(T[] array){int n = array.Length;for (int i = 0; i < n; i++){int r = i + Random.Range(0, n - i);T t = array[r];array[r] = array[i];..._随机方向代码
文章浏览阅读1.3k次。使用Django项目开发项目中,协同开发的童鞋经常会遇到“django.db.utils.InternalError : (1050 Table ‘xxx’ already exists)”这种报错;Django再进行数据迁移过程中若表中已存在此表或者某个字段,跟当前开发环境中的迁移记录不匹配情况才会发生这种报错,解决办法:1、删除当前的迁移记录文件2、删除之前创建的报错表、数据字段3、删除django_migrations当前操作的记录,重新迁移OK..._django.db.utils.internalerror: (1050, "table 'auth_sms_record' already exist
文章浏览阅读8.5k次,点赞5次,收藏64次。空间坐标系以及空间两三维坐标系转换矩阵解释因为工作的原因,需要进行不同坐标系的一个转换,在查阅了众多的网页之后,发现有用的没几个,而且众多都是抄的同一篇文章,而且都是罗列以下旋转的方式,几乎没有解释旋转角的物理意义,也不说这个旋转角怎么得到的。在折腾了一天之后,终于弄清楚了,特意写下来,既能有助于记忆,又能装b,很好很强大。基础背景空间三维坐标系转换,大多出现在像我似的搞地图的这群B人里,当然还有搞游戏的大佬们。所以需要对空间三维坐标系做一个小的总结,来防止忘记或者混乱。具体图形可百度,赖的放图_三维空间坐标系
文章浏览阅读1.5w次,点赞11次,收藏31次。Vue-router是伴随着Vue框架出现的路由系统,它也是公认的一种优秀的路由解决方案。在使用Vue-router时候,我们常常会使用其自带的路径跳转组件Link,通过实现跳转,这和传统的何其相似!但它们到底有什么具体的区别呢?官方中给出的解释是这样的:<router-link> 比起写死的 <a href="..."> 会好一些,理由如下:无论是 HTML5..._a标签和router-link的区别