安排工作在其他事情触发后发生

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.