Как работают функции обратного вызова в NodeJS? - PullRequest
0 голосов
/ 01 июня 2019

Учитывая следующий код:

rectangle.js:

module.exports = (x,y,callback) => {
    if (x <= 0 || y <= 0)
        setTimeout(() => 
            callback(new Error("Rectangle dimensions should be greater than zero: l = "
                + x + ", and b = " + y), 
            null),
            2000);
    else
        setTimeout(() => 
            callback(null, {
                perimeter: () => (2*(x+y)),
                area:() => (x*y)
            }), 
            2000);
}

index.js:

var rect = require('./rectangle');

function solveRect(l,b) {
    console.log("Solving for rectangle with l = "
                + l + " and b = " + b);
    rect(l,b, (err,rectangle) => {
        if (err) {
            console.log("ERROR: ", err.message);
        }
        else {
            console.log("The area of the rectangle of dimensions l = "
                + l + " and b = " + b + " is " + rectangle.area());
            console.log("The perimeter of the rectangle of dimensions l = "
                + l + " and b = " + b + " is " + rectangle.perimeter());
        }
    });
    console.log("This statement after the call to rect()");
};

solveRect(2,4);
solveRect(3,5);
solveRect(0,5);
solveRect(-3,5);

В этой строке rect(l,b, (err,rectangle) мы вызываем функцию rect и передаем ей l,b, err,rectangle. Я вижу, что такое l,b, но не вижу и не понимаю, что такое err, rectangle?

Также не могу понять, где определение функции callback? Это внутренняя функция?

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Обозначение стрелки здесь может сбивать с толку, тем более что оно занимает большую часть вызова функции rect. Это эквивалентно


var callback = function(err,rectangle){
  if(err) {
    // do stuff
  } else {
    // do stuff
  }
};

rect(l,b, callback);

Когда мы вызываем rect(l,b, callback) внутри index.js, он вызывает функцию внутри rectangle.js, передавая ссылку на функцию в index.js (которую я назвал callback выше). Это означает, что когда прямоугольник вызывает callback(new Error( ..., он передает объект Error обратному вызову, определенному в index.js. И когда он вызывает callback(null, ..., он передает null для параметра err и объект прямоугольника для параметра rectangle в callback.

В настоящий момент мы вызываем rect(l,b, callback), но у нас нет параметров err или rectangle, хотя javascript просто знает, что он передает функцию, которая принимает 2 параметра.

0 голосов
/ 01 июня 2019

Обратный вызов - это не что иное, как концепция передачи функции в качестве параметра при вызове функции, например solveRect(2,4, fn). Здесь fn будет функцией.

Вы можете определить его в строке:

solveRect(2,4, function(err,rectangle){
   // your code to handle response or delayed result
});

Или как именованная функция:

let fn = function(err,rectangle){
   // your code to handle response or delayed result
}
solveRect(2,4,fn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...