node.js - 了解回调

标签 node.js

当涉及到 javascript 回调时,我非常困惑......尤其是在尝试同时学习 Node 时。 你看,我理解将一个函数作为参数传递给另一个函数的概念,但最让我困惑的是“接受”回调函数的预制模块。

例如,一个简单的请求如下所示:

var request = require('request');
var url = 'http://www.google.com';

request.get(url, function(error, response, body) {

    if(error){
      console.log('This request resulted in an error', error);
    }
    console.log(body);
});

此 get 方法接受 url 和回调。 谁定义回调被接受?开发商的具体方法是什么? 另外,我们在函数中传递的 3 个参数(错误、响应和正文)...请求模块如何知道在返回时用数据填充这些变量?

最佳答案

想象一下 get 的实现或多或少类似于

function get(url, callback) {
    var response = they somehow retrieve the response;
    var body = they somehow parse the body;
    var error = ...;

    // they call you back using your callback
    callback( error, response, body );
}

如何计算这些值是无关紧要的(这是他们的实际工作),但他们只是回调你,假设你的函数实际上按给定的顺序接受三个参数(如果不是,你只会得到一个运行时错误)。

从这个意义上说,它们也通过......好吧,回调它来“接受”你的回调:) 不用担心参数的数量,因为 Javascript 非常“宽容” - 可以使用任意数量的参数调用方法,包括比函数预期更少或更多的参数。

以此为例:

// they provide 3 arguments
function get( callback ) {
   callback( 0, 1, 2 );
}

// but you seem to expect none
get( function() {
});

get 假设回调接受三个参数,而我传递的方法据称不接受更少参数。这是可行的,尽管 012 这三个参数没有绑定(bind)到任何正式的回调参数(您不能直接引用它们),但它们位于 arguments 对象中,这是一个类似数组的结构:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/arguments

再举一个例子

function get( callback ) {
   callback( 0, 1, 2 );
}

get( function(a,b,c,d,e) {
});

这次我传递的回调似乎需要比调用者提供的更多参数,但这里仍然没有问题。参数绑定(bind)到连续的调用参数,a 将获取 0,b 将获取 1,c 将获取 2,de 将在回调体内获取 undefined

这两个例子都表明调用者并不真正关心你的回调是如何定义的,无论它的参数数量是否符合期望。如果出现任何不匹配,最糟糕的情况可能是出现运行时错误:

function get( callback ) {
   callback( 0, 1, 2 );
}

get( 1 );

// Uncaught TypeError: callback is not a function

关于node.js - 了解回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37423601/

相关文章:

node.js - 每秒真实世界的 mongo 查询/更新

node.js - 使用 mongoose 创建唯一的自动增量字段

node.js - 尽管使用与集线器所示相同的Dockerfile,但重建Docker镜像失败

javascript - Node.js Heroku 部署 - 无法执行安装后脚本来安装 Bower

node.js - DynamoDB 中的原子计数器映射

javascript - 如何检查多边形是否包含 Point Sequelize 和 postgres

javascript - 表达 app.use 刷新行为

javascript - 如何设置 Node 环境来运行涉及 `import ... from ...` 等语法的 ES6 代码?

javascript - 包装没有回调的阻塞调用的优点?

php - NodeJS 从 PHP 服务器接收数据