1

所以基本上我想要做的是有一个我可以添加的函数队列。假设这些函数像在 requestAnimationFrame 中一样将东西绘制到画布上。

我试过的:

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

有了这个,我试图添加如下内容:

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

这只会运行函数并将 undefined 推送到数组,如果你这样做,这将如何工作:

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

3 回答 3

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),它将thisptr 设置为第一个参数,然后使用数组a中的任何参数调用该函数。b

于 2012-10-26T07:03:23.553 回答
0

前段时间我需要做同样的事情!看看这里:https ://github.com/alexandernst/jniftilities#functions-queue

这是一个小型图书馆,可以完全满足您的需求。请参阅同一链接中的评论/示例。

于 2012-10-26T07:01:06.883 回答
0

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

并使用 anObject作为论点。

于 2012-10-26T07:13:16.133 回答