必要なのは、現在の関数の実行が終了したときにコールバック関数を実行することだけです。
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
、 によって「ここに内容が入ります」という警告が表示されます。
関数を呼び出してその結果を渡す ( ) のではなく、関数参照を渡す( ) ことが非常に重要であることに注意してください。質問では適切に実行されていますが、これはよくあるエラーなので指摘する価値はあります。foo
foo()
より高度なもの
場合によっては、コールバックを呼び出して、 の特定の値を確認したいことがあります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`