JavaScript使用递归在循环中间隔一定时间执行任务,优雅的脚本写法

AiWork开发文档

在官方文档的基础上,进行重新排版和优化。
一个优雅的文档,对于开发体验的提升,是效果显著的。
永久域名:aiwork.wiki

按照指定间隔,限时执行任务

每隔一定时间执行一次某个任务,通常使用while方法。

另外,还可以使用 setTimeout 和递归调用来实现。

/**
 * 在指定时间间隔内执行任务,直到达到总时间限制为止。
 * @param {number} intervalInMillis - 每次任务执行之间的时间间隔,单位为毫秒。
 * @param {number} durationInMillis - 总执行时间限制,单位为毫秒。
 * @author 飞云
 * @wechat imfeiyun
 * @link  http://www.feiyunjs.com
 */
function executeWithInterval(intervalInMillis, durationInMillis) {
    // 记录当前时间
    const startTime = Date.now();
    // 计算结束时间
    const endTime = startTime + durationInMillis;

    // 执行任务的函数
    function execute() {
        // 检查当前时间是否小于结束时间
        if (Date.now() < endTime) {
            // 执行任务
            console.log('执行任务');

            // 设置延迟调用 execute 函数,以便在指定间隔后再次执行任务
            setTimeout(execute, intervalInMillis);
        } else {
            // 总时间限制到达,停止执行
            console.log('时间限制到达,停止执行');
        }
    }

    // 启动任务执行
    execute();
}

// 调用函数,每隔 500 毫秒执行一次,总执行时间限制为 5000 毫秒
executeWithInterval(500, 5000);

注释说明:

  1. 函数说明executeWithInterval 函数的作用是定期执行任务,并在指定的总时间内重复执行。
  2. 时间记录:通过 Date.now() 获取当前时间,并计算出结束时间。
  3. 执行任务execute 函数中包含了任务的执行逻辑和条件检查。
  4. 递归调用:使用 setTimeout 递归调用 execute 函数,以便在指定的间隔后继续执行任务。
  5. 停止条件:当当前时间超出结束时间时,停止任务执行并输出结束信息。

根据条件提前结束任务

要在执行任务时,根据某个条件提前结束递归函数,可以在 execute 函数内添加一个条件判断。只要条件满足,就停止递归调用。

/**
 * 在指定时间间隔内执行任务,直到达到总时间限制或某个条件满足为止。
 * @param {number} intervalInMillis - 每次任务执行之间的时间间隔,单位为毫秒。
 * @param {number} durationInMillis - 总执行时间限制,单位为毫秒。
 * @param {function} condition - 判断是否停止执行任务的条件函数,返回 true 表示停止。
 * @author 飞云
 * @wechat imfeiyun
 * @link  http://www.feiyunjs.com
 */
function executeWithInterval(intervalInMillis, durationInMillis, condition) {
    const startTime = Date.now();
    const endTime = startTime + durationInMillis;

    function execute() {
        // 检查当前时间是否小于结束时间并且条件是否满足
        if (Date.now() < endTime && !condition()) {
            // 执行任务
            console.log('执行任务');

            // 设置延迟调用 execute 函数,以便在指定间隔后再次执行任务
            setTimeout(execute, intervalInMillis);
        } else {
            // 条件满足或总时间限制到达,停止执行
            console.log('时间限制到达或条件满足,停止执行');
        }
    }

    // 启动任务执行
    execute();
}

// 示例条件函数,返回 true 表示任务应该停止
function exampleCondition() {
    // 这里可以添加你的条件逻辑
    return Math.random() > 0.8; // 例如,随机停止任务
}

// 调用函数,每隔 500 毫秒执行一次,总执行时间限制为 5000 毫秒
executeWithInterval(500, 5000, exampleCondition);

更新内容:

  1. 条件函数:增加了 condition 参数,作为判断是否停止的条件函数。
  2. 条件判断:在 execute 函数中增加了对 condition() 的检查。如果条件函数返回 true,则停止任务执行。

任务停止时的返回值

要在停止执行时让 executeWithInterval 函数返回一个布尔值(truefalse),你可以使用 Promise 对象来实现。

通过 Promise,你可以在任务完成或条件满足时解析 Promise,并返回相应的结果。

/**
 * 在指定时间间隔内执行任务,直到达到总时间限制或某个条件满足为止,并返回是否因为条件满足而停止。
 * @param {number} intervalInMillis - 每次任务执行之间的时间间隔,单位为毫秒。
 * @param {number} durationInMillis - 总执行时间限制,单位为毫秒。
 * @param {function} condition - 判断是否停止执行任务的条件函数,返回 true 表示停止。
 * @returns {Promise<boolean>} - 一个 Promise 对象,解析为 true 表示因条件满足而停止,false 表示因时间限制到达而停止。
 * @author 飞云
 * @wechat imfeiyun
 * @link  http://www.feiyunjs.com
 */
function executeWithInterval(intervalInMillis, durationInMillis, condition) {
    return new Promise((resolve) => {
        const startTime = Date.now();
        const endTime = startTime + durationInMillis;

        function execute() {
            // 检查当前时间是否小于结束时间并且条件是否满足
            if (Date.now() < endTime && !condition()) {
                // 执行任务
                console.log('执行任务');

                // 设置延迟调用 execute 函数,以便在指定间隔后再次执行任务
                setTimeout(execute, intervalInMillis);
            } else {
                // 条件满足或总时间限制到达,停止执行
                const stoppedDueToCondition = condition(); // 检查条件是否满足
                console.log(stoppedDueToCondition ? '因条件满足而停止执行' : '时间限制到达,停止执行');
                resolve(stoppedDueToCondition); // 解析 Promise,返回 true 或 false
            }
        }

        // 启动任务执行
        execute();
    });
}

// 示例条件函数,返回 true 表示任务应该停止
function exampleCondition() {
    // 这里可以添加你的条件逻辑
    return Math.random() > 0.8; // 例如,随机停止任务
}

// 调用函数,每隔 500 毫秒执行一次,总执行时间限制为 5000 毫秒
executeWithInterval(500, 5000, exampleCondition)
    .then((stoppedDueToCondition) => {
        console.log('任务停止原因:', stoppedDueToCondition ? '条件满足' : '时间限制到达');
    });

更新内容:

  1. PromiseexecuteWithInterval 现在返回一个 Promise 对象。在任务停止时,Promise 会被解析。
  2. 条件检查:在停止执行时,检查条件函数的返回值,以确定停止的原因,并通过 resolve 方法返回 truefalse
  3. Promise 处理:调用 executeWithInterval 后,可以使用 .then() 方法处理结果,输出任务停止的原因。

这样,你可以通过 Promise 处理 executeWithInterval 的结果,并根据任务停止的原因执行相应的逻辑。

递归和while

递归和使用 while 循环在编程中都有各自的特点和适用场景。

递归是函数直接或间接调用自身,通常用于处理可以被分解成更小相同问题的任务,例如树形结构或分治算法。递归代码通常更简洁,但可能导致较高的内存开销和堆栈溢出问题。

while 循环则是通过循环结构重复执行代码块,直到满足退出条件。
它通常用于需要在条件满足之前不断执行的任务,内存使用较为高效,但代码可能更复杂。

总体来说,选择递归还是 while 循环取决于问题的特性和需求。

实际应用

AiWork开发WEBUI脚本界面中,使用异步方式检测更新的思路和具体实现

1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520飞云脚本圈
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » JavaScript使用递归在循环中间隔一定时间执行任务,优雅的脚本写法

企业级大数据智能营销管理系统

了解详情