1. ホーム
  2. javascript

javascriptの関数をキューに保存して、いずれ実行されるようにするにはどうしたらよいでしょうか [重複]。

2023-10-03 07:47:20

質問

javascriptでQueueクラスを作成し、関数をデータとしてキューに格納したいと思っています。そうすれば、リクエスト(関数呼び出し)を蓄積し、必要なときに対応(実際に関数を実行)することができます。

に多少似ていますが、関数をデータとして保存する方法はありますか?

.setTimeout("doSomething()", 1000);

ただし

functionQueue.enqueue(doSomething());

doSomething()をデータとして保存し、キューからデータを取得すると、関数が実行されるようにするところです。

doSomething()を引用符で囲んで -> "doSomething()" と、何らかの方法で文字列を使って関数を呼び出す必要があると思うのですが、どうすればいいか分かる方教えてください。

どのように解決するのですか?

すべての関数は実際には変数なので、すべての関数を配列に格納するのは実はとても簡単です (関数を参照する際に () ):

// Create your functions, in a variety of manners...
// (The second method is preferable, but I show the first for reference.)
function fun1() { alert("Message 1"); };
var fun2 = function() { alert("Message 2"); };

// Create an array and append your functions to them
var funqueue = [];
funqueue.push(fun1);
funqueue.push(fun2);

// Remove and execute the first function on the queue
(funqueue.shift())();

関数にパラメータを渡したい場合は少し複雑になりますが、一度これを行うためのフレームワークをセットアップしておけば、それ以降は毎回簡単に行えるようになります。 基本的に、あなたがしようとしていることは、呼び出されたときに、特定のコンテキストとパラメータセットで定義済みの関数を起動するラッパー関数を作成することです。

// Function wrapping code.
// fn - reference to function.
// context - what you want "this" to be.
// params - array of parameters to pass to function.
var wrapFunction = function(fn, context, params) {
    return function() {
        fn.apply(context, params);
    };
}

さて、ラッピングのためのユーティリティ関数ができたので、それがどのように関数の将来の呼び出しを作るために使われるかを見てみましょう。

// Create my function to be wrapped
var sayStuff = function(str) {
    alert(str);
}

// Wrap the function.  Make sure that the params are an array.
var fun1 = wrapFunction(sayStuff, this, ["Hello, world!"]);
var fun2 = wrapFunction(sayStuff, this, ["Goodbye, cruel world!"]);

// Create an array and append your functions to them
var funqueue = [];
funqueue.push(fun1);
funqueue.push(fun2);

// Remove and execute all items in the array
while (funqueue.length > 0) {
    (funqueue.shift())();   
}

このコードは、ラッパーが配列または一連の引数を使用できるようにすることで改善することができます(しかし、そうすることは私が作ろうとしている例を混乱させるでしょう)。