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中调用它,这又叫什么呢?
答案 0 :(得分:3)
我相信你所寻找的是事件管理。 Node.js提供Event Emitter。浏览器JS没有,但是有很多lib提供了这个功能。
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
另一方面,您的代码看起来更像Deferred(一次性解析,而不是多次触发)。 jQuery提供此功能。我不知道任何原生实现。最接近的是Promise,但承诺是“只读延迟”。他们在施工后不会公开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!');
});
答案 1 :(得分:1)
这是一个非常简单的没有库的调度程序的例子,如果你想看看它如何工作的概念
"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.