什么是uniapp接口请求
Uniapp是一款用于开发跨平台应用的框架,可使用vue语法进行开发。接口请求是uniapp开发中必不可少的一部分,可以通过发送HTTP请求(例如GET、POST)来获取数据、更新数据等等。接口请求能够实现与后端进行数据交互,是很多应用开发的重要环节之一。
uniapp接口请求了两次的原因
1. 代码中重复调用
在uniapp开发中,有可能在代码中重复调用接口请求函数,导致接口被请求多次,进而导致接口请求了两次。以下代码就会导致接口请求两次:
// request.js中的接口请求函数
const api = (options) => {
return uni.request({
method: options.method || 'GET',
url: options.url,
data: options.data || {},
header: options.header || {},
success: options.success || function () {},
fail: options.fail || function () {}
})
}
// 调用api函数的代码
import request from './request.js'
export default {
data() {
return {
userInfo: {}
}
},
created () {
request({
url: '/api/user',
success: res => {
this.userInfo = res.data
}
})
request({
url: '/api/user',
success: res => {
console.log(res)
}
})
}
}
在上述代码中,我们在created
生命周期函数中两次调用request
函数,所以会出现接口请求了两次的情况。
2. 发送重复的请求
如果发送的请求与之前的请求完全相同,就会出现发送了重复的请求,导致接口请求了多次的情况。
以下代码就会导致发送重复的请求:
// request.js中的接口请求函数
const api = (options) => {
return uni.request({
method: options.method || 'GET',
url: options.url,
data: options.data || {},
header: options.header || {},
success: options.success || function () {},
fail: options.fail || function () {}
})
}
// 调用api函数的代码
import request from './request.js'
export default {
data() {
return {
userInfo: {}
}
},
created () {
request({
url: '/api/user',
success: res => {
this.userInfo = res.data
}
})
request({
url: '/api/user',
success: res => {
console.log(res)
}
})
}
}
在此代码中,我们两次发送了相同的请求,所以会出现发送重复请求的情况,从而导致接口请求了两次。
如何解决接口请求两次的问题
针对以上两种情况,我们都可以采取以下方案来解决接口请求了两次的问题:
1. 清除重复请求
在接口请求函数中清除重复请求就可以避免发送多次相同的请求了。
let requestUrlSet = new Set()
const api = (options) => {
let requestUrl = options.url + JSON.stringify(options.data)
if(requestUrlSet.has(requestUrl)) {
return Promise.reject('重复请求')
}
requestUrlSet.add(requestUrl)
return uni.request({
method: options.method || 'GET',
url: options.url,
data: options.data || {},
header: options.header || {},
success: options.success || function () {},
fail: options.fail || function () {
// 请求失败也清除请求链接
requestUrlSet.delete(requestUrl)
},
complete: () => {
// 请求完成清除请求链接
requestUrlSet.delete(requestUrl)
}
})
}
在以上代码中,我们使用了一个Set来存储请求链接,如果链接已经存在,说明发生了重复请求,直接返回Promise.reject
。如果请求成功、失败或者完成,都需要清除相应链接,避免链接堆积、出现异常情况。
2. 防抖处理
使用防抖处理就可以避免重复调用函数,并且不会导致发送多个相同的请求。防抖技术是指在发生某个事件后,有一个wait
时间的间隔,在这个时间段内发生的事件都不会触发函数的执行。在这种情况下,如果事件在wait
时间内多次触发,只有最后一个事件生效。
const debounce = (fn, wait) => {
let timer = null
return function (...args) {
clearTimeout(timer)
timer = setTimeout(() => {
fn.apply(this, args)
}, wait)
}
}
export default {
data() {
return {
userInfo: {}
}
},
created () {
const requestApi = () => {
uni.request({
url: '/api/user',
success: res => {
this.userInfo = res.data
}
})
}
const debounceRequestApi = debounce(requestApi, 300)
debounceRequestApi()
debounceRequestApi()
debounceRequestApi()
}
}
在以上代码中,我们定义了一个debounce
函数来对接口请求函数进行防抖处理。在created
生命周期函数中,我们使用了debounceRequestApi
来代替requestApi
函数,使得多次调用相当于调用一次,避免了重复请求。
总结
高效的接口请求是应用开发的重要环节之一,避免接口请求多次需要我们在使用过程中注意代码调用方式、及时清除重复请求、使用防抖等技术。