javascript - Node中的回调困惑和收集数据

标签 javascript node.js buffer

我是 Node 新手,无法理解这里发生的事情。我的评论在下面,但基本上我真的很难理解为什么 utils.collectData 中的回调在那里(第二个参数)以及它如何任意添加到 消息数组。我怎么知道将来自然会这样做?我知道collectData函数被定义为将回调作为第二个参数,所以让我们从那里开始......

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));
            })
        }

最佳答案

Node.js 中的异步操作遵循简单且一致的模式。掌握这一点将使您的体验更加愉快,您的应用程序更快、更稳定。

我认为这里的其他答案有点没有捕获要点。您调用的方法遵循 Node.js 生态系统中普遍存在的异步模式。有多种模式可以简化这一过程,但您的首要任务应该是彻底了解正在发生的情况以及对代码产生的影响。这很简单:

asyncFunction(functionArguments, callback);

当您调用任何异步函数时,您的脚本将继续执行,而该函数的结果正在等待处理。由于您无法保证结果何时准备就绪,因此您需要在继续之前向函数提供您对结果的意图。通常,您提供的回调将是匿名函数,例如:

getExternalData('http://example.com', function(err, data) {
  console.log('I got the data!');
  // presumably do something with the data
});

回调几乎总是采用两个参数:errdata(或者errresult,或者errwhateverYouAreLookingFor)。如果函数中发生错误,它将返回到您的回调,如果函数执行产生任何数据,它也会返回到您的回调。

这种模式的美妙之处在于,您永远不会被迫阻止事件循环:无论任务的复杂性如何,您的脚本都可以保持愉快的响应。当你的老板在周五午饭后就把一个构思不佳的项目放到你的办公 table 上,然后早早下类去打高尔夫球时,你实际上是在进行异步功能的 Angular 色扮演。

这里的挑战是,当调用回调时,它是原始请求的唯一幸存链接。这有双重含义:

  1. 任何处理响应的逻辑都必须包含在回调中或者可供回调访问;和

  2. try/catch block 对于处理异步函数抛出的任何错误完全没有用处。

第一个含义是通常被描述为“回调 hell ”的起源:在回调中深度嵌套回调。您可以通过提前计划、保持函数较小并遵循相同的参数约定来轻松避免这种情况。

第二个含义意味着您的回调必须检查错误。您通常不会看到抛出的错误,因为在此模式下安全处理抛出的错误的唯一方法是将几乎所有代码放在 try/catch block 中。相反,错误将作为第一个参数传递给回调。如果没有生成错误,第一个参数将为 null。

const myCallback = function(err, data) {
  if (!!err) {
    console.log('Well, that was a failure');
    return err;
  }

  console.log('Everything's great!');
}

这最终有点冗长,但让您适应这种模式至关重要。一些核心模块具有普通和同步版本的函数,例如fs.readFile和fs.readFileSync。不要屈服于使用它们;一旦您习惯了异步,它就会变得非常简单,并且在刚开始时,您需要尽可能多的练习。

祝你好运。

关于javascript - Node中的回调困惑和收集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32546846/

相关文章:

javascript - Jquery 中的变量未在 javascript 中定义

javascript - 为什么我们必须用 [Symbol.iterator] 定义 Symbol.iterator ? javascript 中的可迭代对象?

c# - 在 Reverse 方法中使用 Buffer<TSource> 有什么好处

C/UNIX 从输入读取(受字符计数和超时限制)

sql - 在 CLI 中设置 Sequelize 模型主键类型

c++ - 打包或不打包仅包含数组的结构

javascript - 是否可以阻止/删除 dojo.require 声明的任何缓存脚本?

javascript - 为什么这个函数没有被调用?

node.js - 如何将 NodeJs 服务器连接到 Azure WebChat?

javascript - Mongoose Validation - 执行多个自定义验证