uni-app 定时任务执行时间和请求入参不一致

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

uni-app 定时任务执行时间和请求入参不一致
定时任务我希望获取当前时间,在凌晨2点55执行时候请求的参数是前一天18:55:00的,该如何解决?具体日志如下。谢谢各位大佬。

图片

2 回复

triggerTime是UTC+0时区的,需要加上当地时区获取时间,建议转换为时间戳使用。


在uni-app中实现定时任务时,如果遇到执行时间和请求入参不一致的问题,这通常是因为定时器的回调函数中使用了闭包变量,而这些变量在定时器创建时并未立即绑定其最终值。以下是一个示例代码,展示了如何正确使用定时器并确保执行时间和请求入参一致。

示例场景

假设我们有一个需要每隔一段时间发送网络请求的功能,请求的参数会根据外部输入变化。

错误示例

以下代码展示了一个可能导致执行时间和请求入参不一致的错误用法:

function startTimer(params) {
    setInterval(() => {
        // 这里的params可能并不是预期的值,特别是当外部变量变化时
        uni.request({
            url: 'https://example.com/api',
            method: 'POST',
            data: {
                ...params
            },
            success: (res) => {
                console.log('Request succeeded:', res.data);
            },
            fail: (err) => {
                console.error('Request failed:', err);
            }
        });
    }, 5000); // 每5秒执行一次
}

// 调用函数
let currentParams = { id: 1, name: 'Test' };
startTimer(currentParams);

// 稍后改变参数
setTimeout(() => {
    currentParams = { id: 2, name: 'Another Test' };
}, 3000);

在上述代码中,如果currentParams在定时器运行期间被修改,定时器回调中的params将不会反映最新的值。

正确示例

为了解决这个问题,可以在创建定时器时立即固定参数的值。这可以通过使用立即执行的函数表达式(IIFE)来实现:

function startTimer(params) {
    // 使用IIFE立即固定params的值
    (function(fixedParams) {
        setInterval(() => {
            uni.request({
                url: 'https://example.com/api',
                method: 'POST',
                data: {
                    ...fixedParams
                },
                success: (res) => {
                    console.log('Request succeeded:', res.data);
                },
                fail: (err) => {
                    console.error('Request failed:', err);
                }
            });
        }, 5000); // 每5秒执行一次
    })(params); // 立即执行并传入params
}

// 调用函数
let currentParams = { id: 1, name: 'Test' };
startTimer(currentParams);

// 稍后改变参数
setTimeout(() => {
    currentParams = { id: 2, name: 'Another Test' };
    console.log('Changed params:', currentParams); // 这不会影响已经运行的定时器
}, 3000);

通过这种方式,我们可以确保定时器回调中使用的参数是创建定时器时的值,从而避免执行时间和请求入参不一致的问题。

回到顶部