JavaScriptでカスタムコールバックを作成する 質問する

JavaScriptでカスタムコールバックを作成する 質問する

必要なのは、現在の関数の実行が終了したときにコールバック関数を実行することだけです。

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 
}

これをどのように実装すればよいでしょうか?

ベストアンサー1

実際には、コードはほぼそのまま動作します。コールバックを引数として宣言し、引数名を使用して直接呼び出すことができます。

基礎

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、 によって「ここに内容が入ります」という警告が表示されます。

関数を呼び出してその結果を渡す ( ) のではなく、関数参照を渡す( ) ことが非常に重要であることに注意してください。質問では適切に実行されていますが、これはよくあるエラーなので指摘する価値はあります。foofoo()

より高度なもの

場合によっては、コールバックを呼び出して、 の特定の値を確認したいことがありますthis。これは、JavaScriptcall関数を使用すると簡単に実行できます。

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`

おすすめ記事