安排工作在触发其他操作后进行

Schedule work to happen after someting else triggered

本文关键字:操作 其他 工作      更新时间:2023-09-26

JS中是否有一种简单的方法可以做这样的事情:

var scheduler = ???;
var init;
scheduler.schedule(() => console.log(init)); // does nothing
init = "Hello";
scheduler.start(); // print "Hello" because it was scheduled
scheduler.schedule(() => console.log(" world!")); // instantly print
// "world! " because the scheduler is already active.

我也忘了在CS中怎么称呼这个,这又叫什么?

我相信

您正在寻找的是事件管理。节点.js提供事件发射器。浏览器JS没有,但有很多库提供此功能。

const myEmitter = new EventEmitter();
myEmitter.on('event', () => {
  console.log('an event occurred!');
});
myEmitter.emit('event');

另一方面,您的代码看起来更像是延迟(一次性解析,而不是多触发器)。 jQuery提供了此功能。我不知道任何本机实现。最接近的是承诺,但承诺是"只读延迟"。它们在施工后不会暴露resolve/reject

const deferred = $.Deferred();
deferred.then(function(){
  console.log('the deferred resolved!');
});
deferred.resolve(); // logs
// Fires immediately since deferred is already resolved
deferred.then(function(){
  console.log('the deferred resolved already!');
});

这是一个非常简单的调度程序的示例,没有库,如果你想看看它是如何工作的

"use strict";
class Scheduler {
    constructor(start) {
        this.queue = []
        this.started = !!start
    }
    start() {
        this.started = true
        this.execute()
    }
    stop() {
        this.started = false
    }
    execute() {
        while(this.started && this.queue.length > 0) {
            let fn = this.queue.pop()
            fn()
        }
    }
    schedule(fn, context) {
        if (context) {
            fn = fn.bind(context) 
        }
        this.queue.push(fn)
        this.execute()
    }
}
const scheduler = new Scheduler()
let init
scheduler.schedule(() => console.log(init)) // does nothing
init = "Hello"
scheduler.start() // print "Hello" because it was scheduled
scheduler.schedule(() => console.log(" world!")) // instantly print
// "world! " because the scheduler is already active.