2012-10-26 41 views
1

所以基本上我想要做的是有一個函數隊列,我可以添加到。這些函數被假設爲像在requestAnimationFrame中一樣繪製畫布。js函數隊列

我已經試過什麼:

var drawQueue = []; 
function animate() { 
    while (drawQueue.length !== 0) { 
     drawQueue.shift()(); 
    } 
    requestAnimationFrame(function() { 
     animate(); 
    }); 
} 

有了,我試圖添加的東西,如:

drawQueue.push(drawthing(0,0,0,0)); 

這會運行的功能,推動未定義的陣列,該怎麼做工作,如果你只是這樣做:

drawQueue.push(function() { 
    console.log("derp"); 
}); 

drawQueue.push(functionName); //with no args 

但這裏的問題是,我需要傳遞參數給我打電話的大多數函數。

我的第二次嘗試:

var drawQueue = []; 
function animate() { 
    while (drawQueue.length !== 0) { 
     var data = drawQueue.shift(); 
     Object.apply(data.func, data.args); 
    } 
    requestAnimationFrame(function() { 
     animate(); 
    }); 
} 

,同時增加功能,隊列,如:

drawQueue.push({func: functionName, args: [0,0,0,0]}); 

,但我無法得到那個工作,要麼,不是100%如何使用Object.apply ()以及它在做什麼...

所以我的問題是我該如何去做我的函數隊列還是有更好的方法來做到這一點?

回答

4

你不能添加一些像這樣的隊列:

drawQueue.push(drawthing(0,0,0,0)); 

所有這一切都做的是立即調用drawthing(0,0,0,0)和執行功能到隊列推返回結果。


相反,你需要按實際功能到隊列是這樣的:

drawQueue.push(function() {drawthing(0,0,0,0)}); 

如果你想只推功能和參數到隊列分別是這樣的:

drawQueue.push({func: functionName, args: [0,0,0,0]}); 

然後,您可以從隊列中拉出一個項目並執行它,如下所示:

var item = drawQueue.shift(); 
item.func.apply(this, item.args); 

當你調用function.apply(a, b),它設置this PTR第一個參數a,然後調用與任何參數是b數組中的功能。

+0

如果你打算存儲函數和參數,你可能還需要存儲上下文。 –

+0

@JuanMendes - 這取決於上下文是否需要全局對象以外的東西。他們在最初的例子中似乎並不需要,但顯然這將是更爲一般的解決方案。 – jfriend00

+0

可能爲什麼我更喜歡第一種解決方案,讓調用者根據參數和上下文來決定綁定什麼 –

0

while (drawQueue.length !== 0) { var data = drawQueue.shift(); data.func(data.args); }

和使用參數的Object