web-dev-qa-db-ja.com

コールバック関数の例

次のコードブロックで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();
    }
});
22
AnchovyLegend

関数を引数として渡すときは、コールバック関数と呼ばれ、このコールバック関数を介して値を返すとき、値は渡された関数のパラメーターになります。

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);

つまり、最初にアクションを他の機能に割り当て、これについては考えないでください。条件が満たされると、アクションが実行されます。

27
Suman Bogati

私はあなたに同意します、スニペットのコードは非常に不明瞭です。

あなたが得た答えは素晴らしいですが、あなたのコードでのコールバックの実際の使用について言及しているものはありません。具体的に参照したいと思います。

まず、あなたの質問に答えてから、その複雑さについて詳しく説明します。

答え

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はどのようにコールバックを処理しますか?」というタイトルのドキュメントで、この点を大きなフォントで確実に強調する必要があります。または「コールバックはどのように機能しますか?」。

いい質問です!それから多くを学んだ!

4
guy mograbi

「具体的な」例で単純化してみます(願っています)。

現在の日付を「計算」する関数があり、現在の日付が必要になるたびにその関数を呼び出します(「電話しないで、電話します」など)。

var getCurrentDay = function (callback) {
    var currDate = new Date();        
    callback(currDate, 'err');
   });
};




getCurrentDay(function (returnDay) {         
    logger.info('Today is: ' + returnDay); });
1
lironn

コールバック関数は、別の関数にパラメーターとして渡される関数です(この他の関数を "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

1
RAJA

あまり考えずに、次の例を参照してください。次の例では、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ではパラメーターとして機能を使用できます。

したがって、引数として渡される関数はコールバック関数と呼ばれます。私は今、コールバックが理解できると思います。

0
Mahmudul Hasan

コールバックは、パラメーターを使用して別の関数によって呼び出される関数です

ここであなたのためのクエリは、プログラマが通常どのようにファイルに書き込むかを考えてください:

- `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)

//実行は流れ続けます-ファイルが開かれるのを待ちません

//ファイルが開かれたら、それに書き込むことができますただし、待機中に他のことを行うことができます

0
Avinash Maurya

コールバック関数は次の呼び出しを意味します:)

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
0
Avinash Khadsan