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 是不通的就会卡住不会再住下执行了。

2 回复

当请求的链接不通时,会报错,后边的代码就不继续执行了,想要请求接口报错也能执行后边代码的话,加个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. 同步执行问题

如果你希望在某些情况下同步执行请求,可以使用 Promiseasync/await 来模拟同步执行的效果。

示例:

async function syncRequest() {
    try {
        const data = await fetchData();
        console.log('同步获取的数据:', data);
        // 继续处理其他逻辑
    } catch (error) {
        console.error('请求失败:', error);
    }
}

syncRequest();
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!