uni.request请求的封装

本文介绍了如何在uni-app中进行网络请求的封装,通过在static/js/request.js中创建一个Promise封装的uni.request方法,并在getData.js文件中集中管理所有前端请求接口,如login和register等。这种方式使得页面调用接口更加便捷和统一。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

uni.request请求的封装

(一)static文件夹下创建js文件夹,再创建request.js文件,用于封装请求,使用promise封装

let baseUrl = ''; //域名或选取所有接口不变的那一部分
export const request = (options = {}) => {
	//异步封装接口,使用Promise处理异步请求
	return new Promise((resolve, reject) => {
		// 发送请求
		uni.request({
			url: baseUrl + options.url || '', //接收请求的API
			method: options.method || 'GET', //接收请求的方式,如果不传默认为GET
			data: options.data || {}, //接收请求的data,不传默认为空
		}).then(data => {
			let [err, res] = data;
			resolve(res);
		}).catch(error => {
			reject(error);
		})
	})
}

(二)同样在js文件夹下创建getData.js文件,将前端所有的请求都写在一起

import { request } from './request.js'; //导入封装好的js文件

//每一个请求的接口都返回一个函数,便于直接调用

//请求登录的接口
export const login = (data)=>{
	return request({
		url:'', //后端对应的接口,如果前端配置了跨域,这里直接写http://xx:xx后面的内容
		method:'',//请求的方式,get,post等
		data:data //请求所带的参数
	})
}

//请求注册的接口
export const register = (data)=>{
    return axios.request({
        url:"", 
        method:'post', 
        data:data, 
    })
}
...

(三)页面调用,哪个页面想使用,就在哪个页面中引入getData.js文件

import { login } from '../../static/js/getData.js';

async xx(){
    await login();
}

### 实现 `abort` 方法以支持取消 HTTP 请求 为了在 Uni-app封装 `uni.request` 函数并添加 `abort` 功能,可以采用基于 Promise 和 AbortController 的解决方案。AbortController 是现代浏览器提供的 API,用于更方便地控制 Fetch 请求的终止。 #### 使用 AbortController 控制请求取消 创建一个新的文件 `http.js` 并定义如下代码: ```javascript // @/commons/http.js const pendingRequests = new Map(); function createRequest(config) { let controller; const promise = new Promise((resolve, reject) => { controller = new AbortController(); config.signal = controller.signal; uni.request({ ...config, success(res) { resolve(res.data); }, fail(err) { if (err.errMsg.includes('abort')) { console.log(`Request aborted: ${config.url}`); } reject(err); } }); }); // Store the abort function with a unique key. const cancelToken = () => controller.abort(); pendingRequests.set(promise, cancelToken); promise.cancel = () => { if (pendingRequests.has(promise)) { const cancelFn = pendingRequests.get(promise); cancelFn(); // Call the stored abort method to terminate this request. pendingRequests.delete(promise); // Clean up after cancellation. } }; return promise; } export default async function http(options) { try { const response = await createRequest(options); return response; } catch(error) { throw error; } } ``` 此代码片段实现了带有 `cancel()` 方法的支持取消功能的自定义请求函数[^1]。每当发起新的请求时都会关联一个唯一的控制器实例;当调用 `.cancel()` 时,则会触发相应的信号使当前正在进行中的请求被中断。 #### 导入和使用带取消能力的请求模块 在组件或其他地方引入上述封装好的 `http.js` 文件,并利用其提供的 `cancel` 属性来处理可能需要中途停止的情况: ```javascript import http from '@/commons/http'; async function fetchData() { const reqPromise = http({ url: '/api/data', method: 'GET' }); setTimeout(() => { reqPromise.cancel(); // 取消未完成的请求 }, 5000); try { const result = await reqPromise; console.log(result); } catch(e) { console.error(e.message || e); } } ``` 通过这种方式可以在特定条件下安全地中止不必要的网络活动,从而提高应用性能以及用户体验[^4]。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值