事件驱动&时间驱动

事件驱动

999
参考链接
事件驱动看文字就够了!
我的理解and一些实现想法:
程序不通过循环监听实现事件发生的方式为事件驱动。
具体化就是程序本身有一个主循环体用于接收UI触发的事件,每触发一次循环次数加一,深入循环内部,会对事件进行处理,处理完成后将结果返回以及循环标记位减一,直至标记位为0,循环停止,此时如果再有事件才会使主循环继续运行,大大减少了没必要的进程。

下面是我的实现⬇️

var tasks = new Array(); // 事件数组
function uuid() {
return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(
/[xy]/g,
function (c) {
var r = (Math.random() * 16) | 0,
v = c == "x" ? r : (r & 0x3) | 0x8;
return v.toString(16);
}
);
}
function processInfo(a, b, c) {
return {
uuid: uuid(), // 以时间戳为事件id
event: a, // 事件类型
date: b, // 触发时间
params: c, // 事件参数
result: { flag: false, msg: "" }, // 处理结果
};
} // 加工信息
function mainProcess(params) {
// 主任务循环
tasks.push(params);
function handle(params) {
var time;
time = setInterval(() => {
console.log(
`taskArray size: ${taskArrayLen} - ${new Date().toLocaleString()}`
);
if (taskArrayLen === 0) clearInterval(time);
}, 20);
while (tasks.length > 0) {
var taskArrayLen = tasks.length;
// console.log(
// `taskArray size: ${taskArrayLen} - ${new Date().toLocaleString()}`
// );
switch (
params.event // 进行事件分配
) {
case "onClick": {
var result = onClick(params);
if (result.flag == true) {
var index = tasks.findIndex(
(e) => e.uuid === params.uuid
);
tasks.splice(index, 1);
break;
}
}
case "mouseOn": {
var result = mouseOn(params);
if (result.flag == true) {
var index = tasks.findIndex(
(e) => e.eventId === params.eventId
);
tasks.splice(index, 1);
break;
}
}
}
}
}
handle(params);
}
function onClick(params) {
// console.log(`onClick: ${JSON.stringify(params)}`);
params.result.flag = true;
setTimeout(() => {
console.log("onclick");
}, 2000);
return params.result;
}
function mouseOn(params) {
// console.log(`mouseOn: ${JSON.stringify(params)}`);
params.result.flag = true;
return params.result;
}
for (let i = 0; i < 5; i++) {
var onClick1 = processInfo(
"onClick",
`new Date().toLocaleString()-`,
"one"
);
var mouseOn1 = processInfo("onClick", new Date().toLocaleString(), "one");
mainProcess(onClick1);
mainProcess(mouseOn1);
}
console.log(
`taskArray handle size: ${tasks.length} - ${new Date().toLocaleString()}`
);
// 没做出来

时间驱动

posted @   lambertlt  阅读(686)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示