uni-app 将接口 promise 化

由于uni-app不完全支持proxy,所以需要自行实现一个proxy类,代理uni的接口,将success和fail的回调转为resolve和reject.

promisfy.js

/*
 * @author: hruomei
 * @description: uni-app接口promise化
 * @create-time: 2020/05/19
 * @last-update-time: 2020//05/19
 * @version: V1.0
*/

let $uni;

// #ifdef MP
$uni = new Proxy(wx, {
	get: (target, key) => {
		return (options) => {
			return new Promise((resolve, reject) => {
				target[key]({
					...options,
					success: resolve,
					fail: reject
				});
			})
		}
	},
	set: (target, key, value) => {
		target[key] = value;
	}
})
// #endif

// #ifndef MP
$uni = new Proxy(uni, {
	get: (target, key) => {
		return (options) => {
			return new Promise((resolve, reject) => {
				target[key]({
					...options,
					success: resolve,
					fail: reject
				});
			})
		}
	},
	set: (target, key, value) => {
		target[key] = value;
	}
});
// #endif


export default $uni;

在main.js中 

import $uni from './commons/promisfy.js'

Vue.prototype.$uni = $uni

使用方式

this.$uni.getSystemInfo().then(res => {}).catch(e =>{})

以上方案如果测试有效,后面的内容就不需要看了(本人使用HbuilderX2.6.0以上版本测试H5、APP、小程序三端有效)

 

存在的隐患

uni-app官方文档中说明,IOS8/IOS9/Android设备不支持Proxy(但是我测了是可以用),所以我们可以参考一下方案,模拟Proxy,实现代理

 

**这里只是一个小练习,H5端可以用,但在其他端uni对象被代理不能直接访问,所以在在H5端用着玩玩就好

promisfy.js

function isObject(target) {
	return typeof(target) === 'object' || target === null;
}

function clone(target) {
	if (!isObject(target)) return target;
	
	let newTarget = new Object();
	
	for (let i in target) {
		newTarget[i] = clone(target[i]);
	}
	
	return newTarget;
}

// 因为uni的API只有一个层级,所以这里只代理了1个层级的API,UniProxy只针对uni-app
function UniProxy(target, handle) {
	if (!isObject(target)) throw new Error('UniProxy(): variable "target" must be an object');
	
	let targetCopy = clone(target);
	
	Object.keys(targetCopy).forEach((key) => {
		Object.defineProperty(targetCopy, key, {
			get: () =>  {
				return handle.get && handle.get(target, key);
			},
			set: (newVal) => {
				handle.set && handle.set(target, key, newVal);
			}
		});
	});
	
	return targetCopy;
}


const $uni = new UniProxy(uni, {
	get: (target, key) => {
		return (options) => {
			return new Promise((resolve, reject) => {
				target[key]({
					...options,
					success: resolve,
					fail: reject
				});
			})
		}
	},
	set: (target, key, value) => {
		target[key] = value;
	}
});

export default $uni;

在main.js中 

import $uni from './commons/promisfy.js'

Vue.prototype.$uni = $uni

使用方式

this.$uni.getSystemInfo().then(res => {}).catch(e =>{})

 

uni-app中封装接口的方法可以参考以下步骤: 1. 在utils文件夹下创建一个request.js文件,该文件用于定义接口请求相关的函数和配置。 2. 在request.js文件中,先定义一个baseURL变量,用于存储接口的基地址。 3. 创建一个request函数,该函数接收一个options对象作为参数。在函数内部,使用uni.request方法发送请求。 4. 在request函数内部,需要配置请求的url、方法、参数、请求头等信息,并返回一个Promise对象以进行异步操作。 5. 在uni.request的success回调函数中,判断接口返回的状态码,如果为200则表示请求成功,通过resolve方法将数据返回。 6. 如果状态码不为200,则根据具体情况进行处理,比如判断是否需要跳转到登录页或清除缓存等,并通过reject方法返回相应的错误信息。 7. 在uni.request的fail回调函数中,输出错误信息,并通过reject方法返回错误。 8. 在需要调用接口的页面中,可以在生命周期钩子函数中调用接口请求函数。如果需要传递参数,可以在调用函数时传入参数。 9. 在api文件夹下创建一个index.js文件,用于存放具体的接口请求函数。 10. 在index.js文件中,引入request函数,并定义具体的接口请求函数。在函数中调用request函数,并传入接口的url、方法和参数等信息。 11. 在需要获取数据的页面中,可以通过导入对应的接口请求函数来获取数据。 请注意,以上是一种常见的封装接口的方法,具体实现可以根据项目的需求进行调整和扩展。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [uniapp接口封装](https://blog.csdn.net/weixin_52276970/article/details/126397791)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [uniapp封装接口](https://blog.csdn.net/zhuxiaolong1234/article/details/127816166)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值