2016-04-26 52 views
0

是否有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

你的意思是像'setTimeout的概念()'不? https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers/setTimeout –

+0

這取決於...如果您希望調度程序回調根據設定的時間流逝來觸發,請使用setTimeout( )正如Yuriy所建議的那樣。如果您希望基於其他類型的事件,請將其註冊到相應的事件處理程序。 – RJM

+0

什麼JS環境? – Alnitak

回答

3

我相信你要找的是事件管理。 Node.js提供了Event Emitter。瀏覽器JS沒有,但有很多庫提供這種功能。

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!'); 
}); 
+0

但是這會1)放棄'.emit'後的第一個閉包。 2)在'emit'被過去調用一次之後立即激發我們計劃的新的關閉。 – Dorus

+0

@Dorus更新回答。 – Joseph

+0

謝謝。我的大腦以某種方式阻塞,我現在看到如何再做這些事情。我被告知'$ .Deffered()'實際上是一個老派的承諾。突然我看到這些東西又是如何工作:) – Dorus

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. 
+0

看起來不錯 - 我正在寫一些非常相似的代碼。你應該允許如果預定功能是異步會發生什麼? – Alnitak