1. ホーム
  2. javascript

[解決済み] 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`