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

执行思路:

温馨提示:此处内容需要后才能查看!

以下是实际项目中的更新检测部分的代码:

checkUpdate();   //检测并更新(异步方式)
getUiConfig(confKey);   //读取UI配置

/**
 * 检测并更新(异步方式)
 * @author 飞云
 * @wechat imfeiyun
 * @link  http://www.feiyunjs.com
 */
function checkUpdate() {
$("#btn_begin").addClass('weui-btn_disabled').prop("disabled", true);   //禁用

window.at.publicSet('is_updateing', false);   // 写入公共变量

$.showLoading('更新中...');

performAsyncTask();
function asyncOperation() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            window.at.runJsFile('update.js');
            console.log('异步操作完成');
            resolve();
        }, 1000);
    });
}

async function performAsyncTask() {
    await asyncOperation();
    console.log('async/await 的代码继续执行');
}

// 由于是异步更新,需要等N秒后,再检测共享变量
setTimeout(() => {
    // ///   限时检测是否更新完成
    let limitInMillis = 60 * 1000;   // 限制N秒

    // 调用递归函数,每隔 N 毫秒检查一次共享变量,总执行时间限制为 N 毫秒(exampleCondition返回true可提前结束循环)
    executeWithInterval(3 * 1000, limitInMillis, exampleCondition)
        .then((stoppedDueToCondition) => {
            if (stoppedDueToCondition) {
                console.log('任务因条件满足而停止');

                // 等待N秒后,再关闭Loading
                setTimeout(() => {
                    $.hideLoading();   // 更新完成,关闭loading

                    $("#btn_begin").removeClass('weui-btn_disabled').prop("disabled", false);  // 解除禁用
                }, 5 * 1000);
            } else {
                console.log('任务因时间限制到达而停止');

                $.hideLoading();   // 更新完成,关闭loading

                $("#btn_begin").removeClass('weui-btn_disabled').prop("disabled", false);  // 解除禁用
            }
        });
}, 5 * 1000);
}

// 示例条件函数,返回 true 表示任务应该停止(停止递归)
function exampleCondition() {
// 这里可以添加你的条件逻辑

let resp = window.at.publicGet('is_updateing');   // 读取公共变量
return !toBooleanTrue(resp);   // 返回 true 表示递归应该停止
}

/**
 * 在指定时间间隔内执行任务,直到达到总时间限制或某个条件满足为止,并返回是否因为条件满足而停止。
 * @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();
});
}

关联文章

AiWork热更新在webui中的具体实现
AiWork和autojs使用H5做脚本界面时,处理按钮的重复点击
AiWork和autojs可用的同步POST和异步POST请求,使用H5做脚本界面
autox.js结合JsBridge及weui+实现web界面的交互,应用WebView与 HTML开发脚本界面

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

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

了解详情