基于mpvue微信小程序 promise+wx.request 封装请求

本文介绍了如何在mpvue微信小程序中利用es6-promise封装wx.request,包括安装es6-promise,创建utils文件夹和request.js,定义api.js接口,以及在main.js和页面中引用的方法。

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

第一步:

在微信小程序中引入es6-promise

如果是基于mpvue框架进行微信小程序开发,只需要

npm install es6-promise

第二步:

在项目中创建一个utils文件夹,主要用来装一些用到的工具

然后再utils下面创建一个requet.js

const Promise = require('es6-promise').Promise

function wxPromisify(fn) {
	return function(obj = {}) {
		return new Promise((resolve, reject) => {
			obj.success = function(res) {
				//成功 (只返回res.data)
				resolve(res.data)
			}
			obj.fail = function(res) {
				//失败
				reject(res)
			}
			fn(obj)
		})
	}
}
//无论promise对象最后状态如何都会执行
Promise.prototype.finally = function(callback) {
	let P = this.constructor;
	return this.then(
		value => P.resolve(callback()).then(() => value),
		reason => P.resolve(callback()).then(() => {
			throw reason
		})
	);
};
/**
 * 微信请求get方法
 * url
 * data 以对象的格式传入
 */
function getRequest(url, data) {
	var getRequest = wxPromisify(wx.request)
	return getRequest({
		url: url,
		method: 'GET',
		data: data,
		header: {
			'Content-Type': 'application/json'
		}
	})
}

/**
 * 微信请求post方法封装
 * url
 * data 以对象的格式传入
 */
function postRequest(url, data) {
	var postRequest = wxPromisify(wx.request)
	return postRequest({
		url: url,
		method: 'POST',
		data: data,
		header: {
			"content-type": "application/x-www-form-urlencoded"
		},
	})
}

/**
 * 获取get的URL
 */
function getRquestUrl(url, data) {
	var signArr = [];
	for(var x in data) {
		var sign = x + '=' + data[x];
		signArr.push(sign)
	}

	var signString = '';
	for(var x in signArr) {
		if(parseInt(x) + 1 == 1) {
			signString += signArr[x].toString();
		} else {
			signString += "&" + signArr[x].toString();
		}
	}
	return url + "?" + signString;
}

/*文件上传*/
function uploadFile(url,files,name,data) {
	return new Promise((resolve, reject) => {
		wx.uploadFile({
			url: url,
			filePath: files,
			name: name,
			formData: data,
			success: (res => {
				if(res.statusCode === 200) {
					//200: 服务端业务处理正常结束
					resolve(res)
				} else {
					reject(res)
				}
			}),
			fail: (res => {
				reject(res)
			})
		})
	})
}

module.exports = {
	postRequest: postRequest,
	getRequest: getRequest,
	getRquestUrl: getRquestUrl,
	uploadFile:uploadFile
}

第三步:

在utils文件夹中 ,新建一个api.js文件,主要用来装请求的接口

 

import requestAll from './request' // 此处,引入存放对promise处理的文件

const apiUrl = '域名' 
const webUrl = '域名'

class api {

//首页分享
	indexShare(session,language){
		let data = {
			session,
			language
		}
		return requestAll.postRequest(apiUrl + 'portal/index/wechat_share', data);
	}

}

//暴露接口
export default {
	api:api
}

第四步:

在主文件main.js中 添加api属性 (这里设置才可以在页面中使用)

import Vue from 'vue'
import App from './App'

Vue.config.productionTip = false
App.mpType = 'app'

import Vuex from 'vuex'
Vue.use(Vuex)

import api from './utils/api'
Vue.prototype.$api = api

const app = new Vue(App)
app.$mount()

第五步:

在页面中引用

由于mpvue不可以像vue那样直接 this.$api拿到暴露的接口属性

需要this.$api.api.prototype 才可以拿到api中定义的funciton

<script>


	export default {
		data() {
			return {
				Request: this.$api.api.prototype, //请求头
			}
		},

		methods: {
                    
		    indexShare(){
			var that  = this;
			that.Request.indexShare('参数1','...')
					.then(res =>{
                                                //成功
//						console.log(res)
						
					})
					.catch(res =>{
                                                //失败
						console.log(res)
					})
                    }
       }
</script>

 

这样就可以用promise封装wx.request请求后端接口了,谢谢! 不喜勿喷!

为了更好地管理和执行微信小程序中的网络请求,建议使用ES6的Promise特性对wx.request进行封装。这样不仅可以让代码更加简洁,还能有效地处理异步操作,避免回调地狱的问题。 参考资源链接:[微信小程序封装网络请求:ES6 Promise实现](https://wenku.csdn.net/doc/4dbcd2yw4m?spm=1055.2569.3001.10343) 首先,你需要了解微信小程序wx.request方法,它支持发送GET、POST等多种类型的HTTP请求wx.request方法返回的是一个Promise对象,这使得我们可以利用ES6的Promise特性进行链式调用和错误处理。 下面是一个使用ES6 Promise封装wx.request的示例代码: ```javascript // 封装wx.requestPromise风格的http函数 function http(config) { return new Promise((resolve, reject) => { wx.request(Object.assign({ url: '', // 请求接口地址 method: 'GET', // 请求方法,默认为GET data: {}, // 请求的参数 header: { 'content-type': 'application/json' }, // 请求头 dataType: 'json', // 返回的数据类型 }, config)) .then(response => { if (response.statusCode === 200) { resolve(response.data); } else { reject(new Error('请求失败')); } }) .catch(error => { reject(error); }); }); } // 使用封装后的http函数发起GET请求 http({ url: '***', // 实际的API接口地址 method: 'GET', data: { param1: 'value1', param2: 'value2' } }) .then(data => { console.log('请求成功,返回数据:', data); }) .catch(error => { console.error('请求失败,错误信息:', error); }); ``` 在这个封装中,我们创建了一个http函数,它接收一个包含请求配置的对象作为参数。使用Object.assign方法可以将传入的配置对象和默认配置合并,然后使用wx.request发起请求请求成功后,根据HTTP状态码判断是否成功,并调用resolve或reject函数处理结果。 在实际开发中,可以进一步封装get和post方法,以便直接调用,提高代码的复用性和可读性。这样,你就可以利用ES6的Promise特性在微信小程序中高效地进行网络请求和API接口调用,同时保持代码的整洁和易于管理。 参考资源链接:[微信小程序封装网络请求:ES6 Promise实现](https://wenku.csdn.net/doc/4dbcd2yw4m?spm=1055.2569.3001.10343)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值