uni-app 实现 uni.request 同步请求

发布于 1周前 作者 h691938207 来自 Uni-App

uni-app 实现 uni.request 同步请求

想要封装一个uni.request的同步版本啊…

2 回复

不可能封装出来的 因为底层不支持 同步请求会阻塞导致UI线程卡死,所以底层不会提供的


在uni-app中,uni.request默认是异步执行的,这意味着它不会阻塞后续代码的执行。然而,有时候你可能希望以同步的方式执行请求,尤其是在某些特定的逻辑场景中。虽然uni.request本身不支持同步调用,但我们可以通过一些技巧来模拟同步行为,比如使用async/await语法。

下面是一个使用async/await来模拟同步请求的示例代码:

// 定义一个函数来封装uni.request请求
async function syncRequest(url, data = {}, method = 'GET') {
    try {
        let response = await uni.request({
            url: url,
            data: data,
            method: method,
            header: {
                'Content-Type': 'application/json' // 根据需要设置请求头
            },
            success: (res) => {
                // 这里不需要处理成功回调,因为await会等待uni.request完成并返回结果
                return res.data;
            },
            fail: (err) => {
                // 处理请求失败的情况
                throw new Error(err.errMsg || 'Request failed');
            }
        });

        // 注意:由于uni.request的返回值是一个Promise,所以上面的await会等待Promise解决
        // 并返回res.data。这里的response变量实际上就是res.data。
        return response;
    } catch (error) {
        // 捕获并处理请求中的任何错误
        console.error('Error in syncRequest:', error);
        throw error; // 可以选择重新抛出错误,以便在调用此函数的地方进行处理
    }
}

// 使用该函数
async function fetchData() {
    try {
        let data = await syncRequest('https://api.example.com/data', {}, 'POST');
        console.log('Data fetched:', data);
        // 在这里处理获取到的数据
    } catch (error) {
        // 处理请求错误
        console.error('Failed to fetch data:', error);
    }
}

// 调用fetchData函数
fetchData();

在这个例子中,syncRequest函数是一个异步函数,它使用await来等待uni.request的Promise解决。这样,当你调用syncRequest时,它会“看起来”像是同步的,因为代码会在等待请求完成后再继续执行。然而,需要注意的是,整个fetchData函数仍然是一个异步函数,并且需要使用async关键字来声明。

这种方法并不是真正的同步请求,但它提供了一种在异步代码中实现类似同步行为的方式。在实际应用中,建议尽量使用异步编程模型来处理网络请求,以充分利用JavaScript的并发处理能力。

回到顶部