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();
}
});
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.
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.
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.
data
in nickname
.nickname
auf Socket?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
**/
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!
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); });
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
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.
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
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