1

つまり、基本的に私がやろうとしているのは、追加できる関数のキューを用意することです。これらの関数は、requestAnimationFrame のようにキャンバスに描画することを想定しています。

私が試したこと:

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

ここでの問題は、呼び出しているほとんどの関数に引数を渡す必要があることです。

私の2回目の試み:

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 に答える