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())();
}
このコードは、ラッパーが配列または一連の引数を使用できるようにすることで改善することができます(しかし、そうすることは私が作ろうとしている例を混乱させるでしょう)。
関連
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] JavaScriptでメールアドレスを検証するのに最適な方法は何ですか?
-
[解決済み] JavaScriptでタイムスタンプを取得する方法は?
-
[解決済み] JavaScriptのオブジェクトが空であることをテストするにはどうすればよいですか?
-
[解決済み] JavaScriptで空文字列/未定義文字列/null文字列をチェックするにはどうすればよいですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み] 配列からオブジェクトを生成する
-
[解決済み] URL/アドレスバーからJavascriptの関数を呼び出す
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] JavaScriptで次の要素/前の要素を取得しますか?
-
[解決済み] <Enter>でjQuery UIダイアログを送信する
-
[解決済み] なぜ "use strict "はパフォーマンスを10倍向上させるのか?
-
[解決済み] TypeScriptのdeclare classとinterfaceの違いとは?
-
[解決済み] アサインの左側にJavascriptのオブジェクトブラケット表記({ ナビゲーション } =)があります。
-
[解決済み] $.ajax実行中にローディングイメージを表示する
-
[解決済み] 文字列とラベルのローカライズとグローバリゼーションのベストプラクティス【終了しました
-
[解決済み] JavaScriptで長い配列を小さい配列に分割する方法
-
[解決済み] jQueryを使用して、すべてのクリックイベントハンドラを削除するにはどうすればよいですか?
-
[解決済み] なぜjavascriptのES6 Promisesはresolve後も実行を継続するのですか?