了解节点callback

有人能带我通过所有的callback在这里发生了什么? 我是新来的节点,我迷路了! 我在下面评论了一些混淆的来源。

var utils = require('./utils'); "POST": function(request, response) { //collect the data utils.collectData(request, function(message) { message.objectID = ++objectIDcounter; messages.push(message); utils.sendResponse(response, { objectID: message.objectID }, 201) }) } // this is in utils.js: //why is a callback parameter passed to this function? exports.collectData = function(request, callback) { var data = "" request.on('data', function(chunk) { data += chunk; }) request.on('end', function() { //why is the callback applied here? //Also, we are parsing the data here. why? because it is a buffer or a string here? callback(JSON.parse(data)); }) } 

为什么传递给这个函数的callback参数?

request.on()安装了一个事件处理程序,它将在某个时间被调用(例如将来的任意时间)。 在.collectData()事件处理程序之前, .collectData()方法将返回。

所以,当request.on('end', ...)事件处理程序指示现在已经收集了所有数据时,唯一想要传回所有收集的数据的结果就是调用callback。

让我们用log语句来表示这个事件,也许这会让你知道事件的顺序是如何工作的:

  console.log("before collectData()"); utils.collectData(request, function(message) { console.log("in collectData() callback"); message.objectID = ++objectIDcounter; messages.push(message); utils.sendResponse(response, { objectID: message.objectID }, 201) }) } console.log("after collectData()"); // this is in utils.js: //why is a callback parameter passed to this function? exports.collectData = function(request, callback) { console.log("in collectData() method"); var data = "" request.on('data', function(chunk) { console.log("in request.on('data', ...)"); data += chunk; }) request.on('end', function() { console.log("in request.on('end', ...)"); callback(JSON.parse(data)); }) } 

使用这些console.log()语句,您将在debugging控制台中获得这个序列:

 before collectData() in collectData() method after collectData() in request.on('data', ...) in request.on('data', ...) in request.on('data', ...) in request.on('end', ...) in collectData() callback 

您可以看到collectData()运行并结束,但是事件处理程序仍然存在,因为当传入的数据到达时,它们将执行它们的工作,最后当'end'事件到达时,所有数据都已完成到达可以调用callback来传回最后的数据累积。

这是node.js中I / O的asynchronous性质。 您开始一个操作,设置一些监听器或callback,然后node.js库使用各种OS服务在后台执行实际的I / O操作。 与此同时,其他node.js代码可以继续运行,稍后,I / O操作将完成并在node.js事件队列中插入一个事件。 当前执行的JS线程完成所做的任何事情后,node.js引擎会将下一个事件从事件队列中拉出,并触发与该事件关联的任何callback,从而允许一些node.js代码为该事件提供服务。 node.js的创build者将此称为“已经平衡的I / O”。

虽然这个答案是为浏览器编写的,但事件队列的概念以及如何使用和pipe理在node.js中是相同的,所以这个答案可以帮助您更好地理解: JavaScript如何在后台处理AJAX响应? 以及一篇也可能有助于的文章: 了解node.js事件循环 。

为什么在这里应用callback?

收到'end'事件,告诉代码现在已经收到所有数据。 这个请求将不会有更多的'data'事件。 在这一点上,你知道你现在拥有所有的数据,所以这个地方的callback被称为数据的最终积累。

另外,我们在这里parsing数据。 为什么? 因为这是一个缓冲区或string?

我目前无法findcollectData()的文档,但是它似乎期望JSONstring是数据,因此它正在parsing该JSONstring,以便它可以返回相应的Javascript对象。