次のコードブロックでcallback()
関数がどのように使用されるかを理解するのに苦労しています。関数本体で、callback()
を関数として使用する方法は、function callback{}
定義されていませんか?以下のコールバック関数にパラメーターとしてtrue/falseを渡すことの反発は何ですか?
明確化に感謝します、事前に感謝します!
socket.on('new user', function(data, callback){
if (nicknames.indexOf(data) != -1){
callback(false);
}else{
callback(true);
socket.nickname = data;
nicknames.Push(socket.nickname);
updateUserList();
}
});
関数を引数として渡すときは、コールバック関数と呼ばれ、このコールバック関数を介して値を返すとき、値は渡された関数のパラメーターになります。
function myFunction(val, callback){
if(val == 1){
callback(true);
}else{
callback(false);
}
}
myFunction(0,
//the true or false are passed from callback()
//is getting here as bool
// the anonymous function below defines the functionality of the callback
function (bool){
if(bool){
alert("do stuff for when value is true");
}else {
//this condition is satisfied as 0 passed
alert("do stuff for when value is false");
}
});
基本的に、callbacks()は非同期の概念に使用されます。特定のイベントで呼び出されます。
myFunction
もコールバック関数です。たとえば、クリックイベントで発生します。
document.body.addEventListener('click', myFunction);
つまり、最初にアクションを他の機能に割り当て、これについては考えないでください。条件が満たされると、アクションが実行されます。
私はあなたに同意します、スニペットのコードは非常に不明瞭です。
あなたが得た答えは素晴らしいですが、あなたのコードでのコールバックの実際の使用について言及しているものはありません。具体的に参照したいと思います。
まず、あなたの質問に答えてから、その複雑さについて詳しく説明します。
socket.ioは、私が知っている標準ではない非常にクールなことをしています..socket.ioは、フロントエンドからバックエンドにコールバックを渡しています!
質問に答えるにはwhat is this callback function
-フロントエンドコードを確認する必要があります。
このようなコードを探します
socket.emit('new user', data, function( booleanParameter ){
// what are you doing with booleanParameter here?
});
あなたの場合、true/false値は、新しいユーザーが追加された(true)かそうでない(false)場合にフロントエンドに戻ることを意図していると思います。
あるいは、ニックネームがすでに使用されているかどうかによって、フロントエンドがエラー文字列を表示できるようになります。
基本的に、@ SumanBogatiは彼の答えに正しかったのですが、socket.ioの特別な処理のために、フロントエンドでコールバックを見つけるステップが欠けていると感じました。
data
からnickname
に変更しますnickname
をソケットに配置するのですか?Jsdocsを使用して、コールバックの動作を説明します
/**
@callback NewUserCallback
@param {boolean} booleanParameter does something..
**/
そして、関数自体に
/**
@parameter {string} nickname
@parameter {NewUserCallback} callback
**/
通常、nodejsでは、コールバックは最初の引数がエラーであると想定しています なので、コードを読み取ると、
socket.on('new user', function(data, callback){
if (nicknames.indexOf(data) != -1){
///// THERE IS NO ERROR
callback(false);
}else{
///// THERE IS AN ERROR
callback(true);
/// do more stuff after the error
socket.nickname = data;
nicknames.Push(socket.nickname);
updateUserList();
}
});
あなたが期待するパターンではありませんか?これがあなたが質問をした理由だと思います。
それでも、socket.ioのコールバックが何を意味するのかという疑問は残っていますよね?おそらく、彼らのコールバックは最初の引数としてエラーを期待していません。
Socket.ioを使用したことがないため、これを明確にするためのドキュメントを見つけることができませんでした。だから私は彼らの chat example をダウンロードし、それをデバッグする必要がありました==>そして私が答えたので、彼らはフロントエンドからバックエンドに関数を渡しています。
Socket.ioは、「socket.ioはどのようにコールバックを処理しますか?」というタイトルのドキュメントで、この点を大きなフォントで確実に強調する必要があります。または「コールバックはどのように機能しますか?」。
いい質問です!それから多くを学んだ!
「具体的な」例で単純化してみます(願っています)。
現在の日付を「計算」する関数があり、現在の日付が必要になるたびにその関数を呼び出します(「電話しないで、電話します」など)。
var getCurrentDay = function (callback) {
var currDate = new Date();
callback(currDate, 'err');
});
};
getCurrentDay(function (returnDay) {
logger.info('Today is: ' + returnDay); });
コールバック関数は、別の関数にパラメーターとして渡される関数です(この他の関数を "otherFunction"と呼びます)。コールバック関数は、otherFunction内で呼び出されます(または実行されます)。
コールバック関数の簡単な例を次に示します
// callback add
function add(a, b){
console.log(a+b);
}
// Main function
function getInput(cb) {
c = 5+5;
d = 6+6;
if (typeof cb === 'function') {
cb(c, d);
}
}
getInput(add)
詳細な説明については、これを参照してください link
あまり考えずに、次の例を参照してください。次の例では、print
関数からadd
関数を呼び出すだけです。
function print( ans ){
console.log(ans) ; // 7
}
function add(a, b){
print(a+b) ;
}
add(2,5);
print
関数をパラメーターとして使用するとどうなりますか?グローバルスコープのprint
関数を使用せずに、print
関数を引数として渡すだけです。
function print( ans ){
console.log(ans) ; // 7
}
function add(a, b, callback){ // here callback = print
callback(a+b) ;
}
add(2,5,print); // print function as a parameter
通常、JavaScriptではパラメーターとして機能を使用できます。
したがって、引数として渡される関数はコールバック関数と呼ばれます。私は今、コールバックが理解できると思います。
コールバックは、パラメーターを使用して別の関数によって呼び出される関数です
ここであなたのためのクエリは、プログラマが通常どのようにファイルに書き込むかを考えてください:
- `fileObject = open(file)` //now that we have to wait for the file to open, after that we can write to this file*
- fileObject.write("We are writing to the file.") // but i want to write , not wait
この場合-コールバックが役立つ場合:
//we can pass **writeToFile()** (a callback function) to the open file function
- fileObject = open(file, writeToFile)
//実行は流れ続けます-ファイルが開かれるのを待ちません
//ファイルが開かれたら、それに書き込むことができますただし、待機中に他のことを行うことができます
コールバック関数は次の呼び出しを意味します:)
doHomeWork('math',alertMsg);
上記の行は、1。doHomeWork
を呼び出してから2. alertMsg
を呼び出します。それだけです。
function doHomeWork(subject,callback){
console.info("study: "+subject);
callback();
}
alertMsg = function(){
console.info("alert");
}
doHomeWork('math',alertMsg);
出力:
study: math
alert