関数を別の関数にコールバックとして渡して実行させることは理解していますが、それを行うための最適な実装を理解していません。私はこのような非常に基本的な例を探しています:
var myCallBackExample = {
myFirstFunction : function( param1, param2, callback ) {
// Do something with param1 and param2.
if ( arguments.length == 3 ) {
// Execute callback function.
// What is the "best" way to do this?
}
},
mySecondFunction : function() {
myFirstFunction( false, true, function() {
// When this anonymous function is called, execute it.
});
}
};
MyFirstFunctionでは、新しいcallback()を返すと、匿名関数が機能して実行されますが、それは正しいアプローチではないようです。
あなたは言うことができます
callback();
または、コールバック内でcall
の値を調整する場合は、this
メソッドを使用できます。
callback.call( newValueForThis);
関数内のthis
は、newValueForThis
が何であってもかまいません。
コールバックが存在し、実行可能な関数であるかどうかを確認する必要があります。
if (callback && typeof(callback) === "function") {
// execute the callback, passing parameters as necessary
callback();
}
多くのライブラリ(jQuery、dojoなど)は、非同期関数に対して同様のパターンを使用し、すべての非同期関数に対してnode.jsを使用します(nodejsは通常error
およびdata
をコールバックに渡します)。彼らのソースコードを調べると助けになるでしょう!
関数を実行するには、主に3つの可能性があります。
var callback = function(x, y) {
// "this" may be different depending how you call the function
alert(this);
};
選択する方法は、次のいずれかによって異なります。
Function.call 、 Function.apply のドキュメント
コールバックはシグナルに関するもので、「新規」はオブジェクトインスタンスの作成に関するものです。
この場合、「callback();」だけを実行することがさらに適切です。とにかく戻り値で何もしていないため、「return new callback()」よりも.
(およびarguments.length == 3テストは本当に不格好で、fwiw、コールバックparamが存在し、関数であることを確認した方が良いです。)
適切な実装は次のとおりです。
if( callback ) callback();
これにより、コールバックパラメーターがオプションになります。
次を使用できます。
if (callback && typeof(callback) === "function") {
callback();
}
以下の例はもう少し包括的です:
function mySandwich(param1, param2, callback) {
alert('Started eating my sandwich.\n\nIt has: ' + param1 + ', ' + param2);
var sandwich = {
toppings: [param1, param2]
},
madeCorrectly = (typeof(param1) === "string" && typeof(param2) === "string") ? true : false;
if (callback && typeof(callback) === "function") {
callback.apply(sandwich, [madeCorrectly]);
}
}
mySandwich('ham', 'cheese', function(correct) {
if (correct) {
alert("Finished eating my " + this.toppings[0] + " and " + this.toppings[1] + " sandwich.");
} else {
alert("Gross! Why would I eat a " + this.toppings[0] + " and " + this.toppings[1] + " sandwich?");
}
});
function checkCallback(cb) {
if (cb || cb != '') {
if (typeof window[cb] === 'undefined') alert('Callback function not found.');
else window[cb].call(this, Arg1, Arg2);
}
}
JavaScriptのcallback()
関数を説明する基本的な例を次に示します。
var x = 0;
function testCallBack(param1, param2, callback) {
alert('param1= ' + param1 + ', param2= ' + param2 + ' X=' + x);
if (callback && typeof(callback) === "function") {
x += 1;
alert("Calla Back x= " + x);
x += 1;
callback();
}
}
testCallBack('ham', 'cheese', function() {
alert("Function X= " + x);
});