Empecé a aprender Node Js y luego obtuve el siguiente código en el tutorial
const readline = require("readline"); const rl = readline.createInterface({ input: process.stdin, output: process.stdout }); const questions = [ "What is your name? ", "Where do you live? ", "What are you going to do with node js? " ]; const collectAnswers = (questions, done) => { const answers = []; const [firstQuestion] = questions; const questionAnswered = answer => { answers.push(answer); if (answers.length < questions.length) { rl.question(questions[answers.length], questionAnswered); } else { done(answers); } }; rl.question(firstQuestion, questionAnswered); }; collectAnswers(questions, answers => { console.log("Thank you for your answers. "); console.log(answers); process.exit(); });El código tiene el siguiente resultado.
What is your name? a Where do you live? b What are you going to do with node js? c Thank you for your answers. [ 'a', 'b', 'c' ]Por lo que entiendo, la variable collectAnswer de alguna manera inyecta la función declarada a continuación en el segundo parámetro ( hecho ). ¿Alguien puede explicar lo que realmente está sucediendo detrás de escena? ¿Cómo se puede inyectar la función declarada a continuación a la variable con el mismo nombre? ¿Algún término que este patrón realmente llame?
Las funciones son objetos en JavaScript, a diferencia de otros lenguajes, por lo que puede pasarlas a funciones como argumentos y las funciones pueden recibirlas como parámetros. Esto se hace mucho para que la función a la que está llamando pueda "devolver la llamada" a su código (la función que está pasando). Una función utilizada de esta manera a menudo se denomina "devolución de llamada". Una función como collectAnswers que acepta una función a la que va a llamar de esta manera a menudo se describe como una función que "acepta una devolución de llamada".
En ese código, hay una función llamada collectAnswers y acepta dos parámetros, questions y done :
const collectAnswers = (questions, done) => { // ^^^^^^^^^−−^^^^−−−−−−−−−−−−−−−− parameters // ... }; Al final, el código llama a collectAnswers , pasando una serie de preguntas y una nueva función creada en línea como el segundo argumento (coloqué los dos argumentos en líneas separadas para mayor claridad):
collectAnswers( questions, // 1st argument answers => { // console.log("Thank you for your answers. "); // console.log(answers); // 2nd argument process.exit(); // } // ); Eso hace lo mismo que esto, excepto por la constante de callback de llamada:
const callback = answers => { console.log("Thank you for your answers. "); console.log(answers); process.exit(); }; collectAnswers(questions, callback);