在触发其他事件后安排工作

时间:2016-04-26 20:47:22

标签: javascript scheduling

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中调用它,这又叫什么呢?

2 个答案:

答案 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.