[解決済み] JavaScriptでカスタムコールバックを作成する
2022-03-17 09:03:18
質問
現在の関数の実行が終了したら、コールバック関数を実行するだけでいいんです。
function LoadData()
{
alert('The data has been loaded');
//Call my callback with parameters. For example,
//callback(loadedData , currentObject);
}
この関数のコンシューマは次のようなものである。
object.LoadData(success);
function success(loadedData , currentObject)
{
//Todo: some action here
}
どのように実装すればよいのでしょうか?
どのように解決するのですか?
コールバックを引数として宣言すれば、引数名を使って直接呼び出すことができます。
基本的なこと
function doSomething(callback) {
// ...
// Call the callback
callback('stuff', 'goes', 'here');
}
function foo(a, b, c) {
// I'm the callback
alert(a + " " + b + " " + c);
}
doSomething(foo);
これは
doSomething
を呼び出し、その結果
foo
という警告が表示されます。
を渡すことが非常に重要であることに注意してください。
参照
(
foo
) のように、関数を呼び出してその結果を渡すのではなく、 (
foo()
). 質問者さんはちゃんとやっていますが、よくある間違いなので、指摘しておきます。
より高度な内容
の特定の値を見るためにコールバックを呼び出したいことがあります。
this
. これは、JavaScript の
call
関数を使用します。
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.call(this);
}
function foo() {
alert(this.name);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Joe" via `foo`
また、引数を渡すこともできます。
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback, salutation) {
// Call our callback, but using our own instance as the context
callback.call(this, salutation);
}
function foo(salutation) {
alert(salutation + " " + this.name);
}
var t = new Thing('Joe');
t.doSomething(foo, 'Hi'); // Alerts "Hi Joe" via `foo`
コールバックに渡す引数を個別に渡すのではなく、配列として渡すと便利な場合があります。その場合は
apply
を使えば、そのようなことができます。
function Thing(name) {
this.name = name;
}
Thing.prototype.doSomething = function(callback) {
// Call our callback, but using our own instance as the context
callback.apply(this, ['Hi', 3, 2, 1]);
}
function foo(salutation, three, two, one) {
alert(salutation + " " + this.name + " - " + three + " " + two + " " + one);
}
var t = new Thing('Joe');
t.doSomething(foo); // Alerts "Hi Joe - 3 2 1" via `foo`
関連
-
Vueでルートネスティングを実装する例
-
[解決済み】ローカルファイルを開くことができません - Chrome: ローカルリソースの読み込みが許可されていない
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] JavaScriptで文字列が部分文字列を含むかどうかを確認する方法は?
-
[解決済み] あるJavaScriptファイルを他のJavaScriptファイルにインクルードするにはどうすればよいですか?
-
[解決済み] GUID / UUIDの作成方法
-
[解決済み] JSONPとは何か、なぜ作られたのか?
-
[解決済み】JavaScriptの比較では、どちらの等号演算子(== vs ===)を使うべきですか?
-
[解決済み】JavaScriptで文字列の出現箇所をすべて置換する方法
-
[解決済み】オブジェクトからプロパティを削除する(JavaScript)
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
fetch ネットワークリクエストラッパーの説明例
-
Vueがechartsのtooltipにクリックイベントを追加するケーススタディ
-
vueネットワークリクエストソリューション ネイティブネットワークリクエストとjsネットワークリクエストライブラリ
-
Vueはランニングライト形式のテキストを水平方向にスクロールする機能を実装している
-
vueディレクティブv-bindの使用と注意点
-
Vueの「データを聴く」原則を解説
-
[解決済み】awaitは非同期関数でのみ有効です。
-
[解決済み】TypeErrorの解決方法。未定義またはヌルをオブジェクトに変換できない
-
[解決済み】JavaScriptでインラインIF文の書き方は?
-
[解決済み】 env: node: macにそのようなファイルやディレクトリはありません