【问题标题】:How does callback functions work in NodeJS?回调函数在 NodeJS 中是如何工作的?
【发布时间】:2019-10-17 21:09:24
【问题描述】:

考虑以下代码:

矩形.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函数的定义在哪里?是内部函数吗?

【问题讨论】:

  • callbackrect 函数的参数,其值是您作为参数提供的(err, rectangle) =&gt; ... 函数。
  • 这与xy从函数参数中获取的方式没有什么不同。
  • errrectangleindex.js中匿名函数的参数。
  • 当您在 rectangle.js 中调用回调时,您正在传递这些参数。
  • 也许你不明白箭头函数符号? (err, rectangle) =&gt; {...} 类似于 function(err, rectangle) {...}

标签: javascript node.js error-handling callback


【解决方案1】:

回调只不过是在函数调用中将函数作为参数传递的概念,例如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)

【讨论】:

  • rect(l,b, (err,rectangle)这一行中,我们调用rect函数并将l,b, err,rectangle传递给它。我可以看到l,b 是什么,但看不到和理解err, rectangle 是什么?
  • 无论你在哪里调用callback,从rectangle.js:函数调用callback作为参数传递的参数将分别是错误和矩形。
【解决方案2】:

箭头符号在这里可能会造成混淆,尤其是因为它占用了大部分 rect 函数调用。相当于


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

rect(l,b, callback);

当我们在 index.js 中调用 rect(l,b, callback) 时,它会调用 rectangle.js 中的函数,并传入对 index.js 中函数的引用(我在上面将其命名为回调)。这意味着当矩形调用callback(new Error( ... 时,它会将Error 对象传递给index.js 中定义的回调。当它调用callback(null, ... 时,它传递了null 用于错误参数和矩形对象用于callback 中的矩形参数。

在我们调用 rect(l,b, callback) 的那一刻,虽然我们没有 err 或 rectangle 参数,但 javascript 只知道它正在传递一个接受 2 个参数的函数。

【讨论】:

  • err,rectangle 必须在 rectangle.js 内计算并且我们没有在 index.js 内时,我们如何从 index.js 内部传递 err,rectangle
  • 我的意思是我们将两个参数从index.js 传递到rectangle.js,我们目前没有它们,它们必须在rectangle.js 内部计算。那么我们是如何通过它们的呢?
  • 如果您仍然感到困惑,请告诉我 :)
  • 正如我猜想和理解的那样,这有点像两步函数调用。在第一步中,它只将l,b 参数从index.js 传递给rectangle.js,然后在rectangle.js 中它将计算error,rectangle,考虑到l,b 是什么,并将它们再次传递给index.js。第二步,index.js 使用这个err,rectangle 并再次将它们传递给rectangle.js 以计算错误消息或面积和周长。
猜你喜欢
  • 2017-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
相关资源
最近更新 更多