it-swarm.com.de

Callback-Funktionsbeispiel

Es fällt mir schwer zu verstehen, wie die Funktion callback() im folgenden Codeblock verwendet wird. Wie verwenden wir callback() als Funktion, im Funktionshauptteil, wenn function callback{} nicht definiert wurde? Was ist die Rückwirkung der Übergabe von true/false als Parameter an die Callback-Funktion unten? 

Ich freue mich über jede Klarstellung, danke im Voraus!

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();
    }
});
18
AnchovyLegend

Wenn Sie eine Funktion als Argument übergeben, spricht man von einer Callback-Funktion. Wenn Sie einen Wert über diese Callback-Funktion zurückgeben, ist der Wert ein Parameter der übergebenen Funktion.

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 () werden grundsätzlich für asynchrone Konzepte verwendet. Es wird für ein bestimmtes Ereignis aufgerufen.

myFunction ist auch eine Rückruffunktion. Beispielsweise tritt es bei einem Klickereignis auf.

document.body.addEventListener('click', myFunction);

Das bedeutet, dass Sie die Aktion zuerst einer anderen Funktion zuweisen und nicht darüber nachdenken. Die Aktion wird ausgeführt, wenn die Bedingung erfüllt ist.

22
Suman Bogati

Ich stimme Ihnen zu, der Code im Snippet ist sehr unklar. 

Die Antworten, die Sie erhalten haben, sind großartig, jedoch bezieht sich keine auf die tatsächliche Verwendung von Rückruf in Ihrem Code, und ich möchte das ausdrücklich erwähnen. 

Zuerst werde ich Ihre Frage beantworten und dann auf die Komplexität eingehen. 

Die Antwort

es stellt sich heraus, dass socket.io etwas sehr Cooles macht, was nicht der Standard ist, den ich kenne ... socket.io gibt den Callback vom Frontend an das Backend weiter! 

Um Ihre Frage what is this callback function zu beantworten, müssen Sie sich Ihren Frontend-Code ansehen. 

Suchen Sie nach Code, der so aussieht 

  socket.emit('new user', data, function( booleanParameter ){
        // what are you doing with booleanParameter here?
  });

Ich gehe davon aus, dass in Ihrem Fall true/false-Werte an das Frontend übergeben werden sollen, wenn ein neuer Benutzer hinzugefügt wurde (true) oder nicht (false). 

Oder vielleicht, wenn der Kurzname bereits verwendet wird oder nicht, sodass das Frontend eine Fehlerzeichenfolge anzeigen kann, wenn es ist .. 

Grundsätzlich hatte @SumanBogati recht mit seiner Antwort, aber ich hatte das Gefühl, dass es an dem Schritt mangelte, den Callback im Frontend aufgrund der speziellen Behandlung von socket.io zu finden. 

Weitere Vorschläge Um Ihren Code klarer zu machen

  • Ändern Sie den Namen des Parameters data in nickname.
  • Fügen Sie Kommentare hinzu - warum setzen Sie nickname auf Socket?
  • dokumentation hinzufügen

Verwenden Sie jsdocs, um zu erklären, was der Rückruf tut 

/**

     @callback NewUserCallback 
     @param {boolean} booleanParameter does something.. 

**/

und dann auf die Funktion selbst 

/**
     @parameter {string} nickname 
     @parameter {NewUserCallback} callback
**/

Die Komplexität

Normalerweise erwartet ein Rückruf in nodejs, dass das erste Argument ein Fehler ist . Lesen Sie also Ihren Code, heißt es

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

Nicht das Muster, das Sie erwarten würden, oder? Ich denke, deshalb haben Sie die Frage gestellt. 

Es bleibt immer noch die Frage, was Socket.ios Rückruf bedeutet, oder? Möglicherweise erwartet ihr Rückruf keinen Fehler als erstes Argument. 

Ich habe noch nie socket.io verwendet, und ich konnte keine Dokumentation finden, um das zu klären. Also musste ich ihr chat example herunterladen und debuggen ==> und so die Antwort, die ich gab, sie übergeben die Funktion vom Frontend an das Backend. 

Socket.io sollte diesen Punkt auf jeden Fall in großen Schriften in der Dokumentation unter dem Titel "Wie behandelt socket.io Callbacks?" Hervorheben. oder "Wie funktionieren unsere Rückrufe?". 

Tolle Frage! Sehr viel daraus gelernt!

4
guy mograbi

Ich werde versuchen, es mit einem "konkreten" Beispiel zu vereinfachen (hoffe ich).

Nehmen wir an, ich habe eine Funktion, die den aktuellen Tag "berechnet", und ich werde diese Funktion jedes Mal anrufen, wenn ich den aktuellen Tag benötigen würde ("Rufen Sie uns nicht an, wir rufen Sie an" oder was auch immer).

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




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

Eine Rückruffunktion ist eine Funktion, die als Parameter an eine andere Funktion übergeben wird (wir nennen diese andere Funktion "otherFunction"). Die Callback-Funktion wird innerhalb der otherFunction aufgerufen (oder ausgeführt).

Hier ist mein einfaches Beispiel für die Rückruffunktion

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

Für detaillierte Erklärungen verweisen Sie auf diesen Link

1
RAJA

Ohne zu viel nachzudenken, siehe folgendes Beispiel: Im folgenden Beispiel rufe ich einfach die Funktion print von der Funktion add auf.

function print( ans ){
    console.log(ans) ; // 7
}
function add(a, b){
    print(a+b) ;
}

add(2,5);

Was ist, wenn ich die print-Funktion als Parameter verwende? Ohne die print-Funktion aus dem globalen Bereich zu verwenden, übergebe ich einfach die print-Funktion als Argument.

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 

Im Allgemeinen erlaubt JavaScript die Funktion als Parameter.

Jede Funktion, die als Argument übergeben wird, wird als Callback-Funktion bezeichnet. Ich denke, Callback ist jetzt für Sie verständlich.

0
Mahmudul Hasan

Ein Rückruf ist eine Funktion, die von einer anderen Funktion mit einem Parameter aufgerufen wird

Hier eine Abfrage für Sie Angenommen, Überlegen Sie, wie Programmierer normalerweise in eine Datei schreiben:

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

Dieser Fall - wo Rückrufe hilfreich sind:

//we can pass **writeToFile()** (a callback function) to the open file function

 - fileObject = open(file, writeToFile)

// Die Ausführung läuft weiter - wir warten nicht darauf, dass die Datei geöffnet wird

// Sobald die Datei geöffnet ist, können wir darauf schreiben, aber während wir warten, können wir andere Dinge tun

0
Avinash Maurya

Rückruffunktion bedeutet Anruf nach dem anderen :)

doHomeWork('math',alertMsg);

Oben steht: 1. Rufe doHomeWork und dann 2. alertMsg an, das war's. :)

function doHomeWork(subject,callback){
  console.info("study: "+subject);
  callback();
}

alertMsg = function(){
  console.info("alert");
}

doHomeWork('math',alertMsg);

Ausgabe:

study: math
alert
0
Avinash Khadsan