安排工作在其他事情触发后发生
Schedule work to happen after someting else triggered
在 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里怎么叫了,请问这个又叫什么?
我相信您正在寻找的是活动管理。 Node.js 提供 Event Emitter。 none 用于浏览器 JS,但有很多库提供此功能。
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
另一方面,您的代码看起来更像 Deferred (one-time resolve, not multi-trigger). jQuery provides this functionality. I'm not aware of any native implementation. The closest would be a Promise,但承诺是 "read-only deferreds"。他们在构建后不会暴露 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.
在 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里怎么叫了,请问这个又叫什么?
我相信您正在寻找的是活动管理。 Node.js 提供 Event Emitter。 none 用于浏览器 JS,但有很多库提供此功能。
const myEmitter = new EventEmitter();
myEmitter.on('event', () => {
console.log('an event occurred!');
});
myEmitter.emit('event');
另一方面,您的代码看起来更像 Deferred (one-time resolve, not multi-trigger). jQuery provides this functionality. I'm not aware of any native implementation. The closest would be a Promise,但承诺是 "read-only deferreds"。他们在构建后不会暴露 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.