按照指定间隔,限时执行任务
每隔一定时间执行一次某个任务,通常使用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);
注释说明:
- 函数说明:
executeWithInterval
函数的作用是定期执行任务,并在指定的总时间内重复执行。 - 时间记录:通过
Date.now()
获取当前时间,并计算出结束时间。 - 执行任务:
execute
函数中包含了任务的执行逻辑和条件检查。 - 递归调用:使用
setTimeout
递归调用execute
函数,以便在指定的间隔后继续执行任务。 - 停止条件:当当前时间超出结束时间时,停止任务执行并输出结束信息。
根据条件提前结束任务
要在执行任务时,根据某个条件提前结束递归函数,可以在 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);
更新内容:
- 条件函数:增加了
condition
参数,作为判断是否停止的条件函数。 - 条件判断:在
execute
函数中增加了对condition()
的检查。如果条件函数返回true
,则停止任务执行。
任务停止时的返回值
要在停止执行时让 executeWithInterval
函数返回一个布尔值(true
或 false
),你可以使用 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 ? '条件满足' : '时间限制到达');
});
更新内容:
- Promise:
executeWithInterval
现在返回一个Promise
对象。在任务停止时,Promise
会被解析。 - 条件检查:在停止执行时,检查条件函数的返回值,以确定停止的原因,并通过
resolve
方法返回true
或false
。 - Promise 处理:调用
executeWithInterval
后,可以使用.then()
方法处理结果,输出任务停止的原因。
这样,你可以通过 Promise
处理 executeWithInterval
的结果,并根据任务停止的原因执行相应的逻辑。
递归和while
递归和使用 while
循环在编程中都有各自的特点和适用场景。
递归是函数直接或间接调用自身,通常用于处理可以被分解成更小相同问题的任务,例如树形结构或分治算法。递归代码通常更简洁,但可能导致较高的内存开销和堆栈溢出问题。
while
循环则是通过循环结构重复执行代码块,直到满足退出条件。
它通常用于需要在条件满足之前不断执行的任务,内存使用较为高效,但代码可能更复杂。
总体来说,选择递归还是 while
循环取决于问题的特性和需求。
实际应用
1. 官方交流QQ群,添加多个不批。建议使用安卓手机或电脑申请。
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » JavaScript使用递归在循环中间隔一定时间执行任务,优雅的脚本写法
飞云脚本圈: 586333520
Auto.js学习交流③群:286635606
Auto.js学习交流②群:712194666(满员)
IOS免越狱自动化测试群:691997586
2. 盗版,破解有损他人权益和违法作为,请各位会员支持正版。
3. 本站部分资源来源于用户上传和网络搜集,如有侵权请提供版权证明并联系站长删除。
4.如未特别申明,本站的技术性文章均为原创,未经授权,禁止转载/搬运等侵权行为。
5.全站所有付费服务均为虚拟商品,购买后自动发货。售出后概不接受任何理由的退、换。注册即为接受此条款。
6.如果站内内容侵犯了您的权益,请联系站长删除。
飞云脚本 » JavaScript使用递归在循环中间隔一定时间执行任务,优雅的脚本写法