uni-app中uni.request请求使用异步同步执行会出现卡住无响应
uni-app中uni.request请求使用异步同步执行会出现卡住无响应
类别 | 信息 |
---|---|
产品分类 | uniapp/App |
PC开发环境 | Mac |
PC开发环境版本 | 14.0 |
HBuilderX类型 | 正式 |
HBuilderX版本 | 3.99 |
手机系统 | iOS |
手机系统版本 | iOS 15 |
手机厂商 | 苹果 |
手机机型 | iphone se2 |
页面类型 | vue |
vue版本 | vue3 |
打包方式 | 云端 |
项目创建方式 | HBuilderX |
示例代码:
async function test(){
console.log('开始'); // 打印完这个就出现卡住了
let res = await uni.request({
url: 'http://xxxx.com', // 这个链接是个不通的url就会卡住,如果通才会往下执行
timeout: 3000,
})
console.log(res);
console.log('结束');
}
test()
操作步骤:
async function test(){
console.log('开始'); // 打印完这个就出现卡住了
let res = await uni.request({
url: 'http://xxxx.com', // 可以链接换上能连上的和连不上的各执行一次就会发现问题
timeout: 3000,
})
console.log(res);
console.log('结束');
}
test()
预期结果:
正常会打印 开始 -> 请求结束 -> 结束
实际结果:
现在却只打印 开始 -> 卡住无响应
bug描述:
ios 使用 uni.request 做异步同步处理时,如果 url 是不通的就会卡住不会再住下执行了。
当请求的链接不通时,会报错,后边的代码就不继续执行了,想要请求接口报错也能执行后边代码的话,加个try catch就可以了
async function test() {
console.log(‘开始’); // 打印完这个就出现卡住了
let res;
try {
res = await uni.request({
url: ‘http://tesdasu.com’, // 这个链接是个不通的url就会卡住,如果通才会往下执行
timeout: 3000,
})
} catch (e) {
//TODO handle the exception
}
console.log(res);
console.log(‘结束’);
},
在 uni-app
中使用 uni.request
进行网络请求时,如果处理不当,可能会出现请求卡住或无响应的情况。这通常与异步操作的处理方式有关。以下是一些可能导致问题的原因以及解决方法:
1. 异步请求未正确处理
uni.request
是一个异步操作,如果你没有正确处理异步操作的返回结果,可能会导致程序卡住或无响应。
错误示例:
function fetchData() {
let result;
uni.request({
url: 'https://example.com/api',
success: (res) => {
result = res.data;
}
});
return result; // 这里返回的是 undefined,因为请求是异步的
}
正确示例:
function fetchData() {
return new Promise((resolve, reject) => {
uni.request({
url: 'https://example.com/api',
success: (res) => {
resolve(res.data);
},
fail: (err) => {
reject(err);
}
});
});
}
// 使用 async/await 调用
async function getData() {
try {
const data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
getData();
2. 请求超时
如果服务器响应时间过长,可能会导致请求超时。uni.request
默认的 timeout
是 60000 毫秒(60秒),你可以根据实际情况调整超时时间。
示例:
uni.request({
url: 'https://example.com/api',
timeout: 10000, // 设置超时时间为 10 秒
success: (res) => {
console.log(res.data);
},
fail: (err) => {
console.error('请求失败', err);
}
});
3. 网络问题
如果用户的网络环境较差,可能会导致请求无法正常发送或接收响应。你可以在请求失败时进行重试或提示用户检查网络。
示例:
function fetchData(retryCount = 3) {
return new Promise((resolve, reject) => {
uni.request({
url: 'https://example.com/api',
success: (res) => {
resolve(res.data);
},
fail: (err) => {
if (retryCount > 0) {
console.log('请求失败,重试中...');
fetchData(retryCount - 1).then(resolve).catch(reject);
} else {
reject(err);
}
}
});
});
}
4. 同步执行问题
如果你希望在某些情况下同步执行请求,可以使用 Promise
和 async/await
来模拟同步执行的效果。
示例:
async function syncRequest() {
try {
const data = await fetchData();
console.log('同步获取的数据:', data);
// 继续处理其他逻辑
} catch (error) {
console.error('请求失败:', error);
}
}
syncRequest();