发送电子邮件时Nodejs eventloop

时间:2017-03-01 08:24:23

标签: javascript node.js event-loop

我是Nodejs的新手,并且一直使用Express框架来构建Web应用程序。在应用程序中,我在有人成功支付项目后创建收据,我想通过电子邮件将收据发送给他们。

最好的方法是什么?我想在用户将帖子发送到/付款后我可以将它们重新路由到端点,该端点通过电子邮件发送电子邮件,然后将它们重新路由到/收据以显示收据。或者我可以在/ payment中执行此操作,但是会阻止任何内容并使其变慢,使用Stripe结帐并将所有内容添加到数据库已经需要几秒钟。

即使我已经阅读了很多关于它的内容,但我并不完全理解整个eventloop概念。我理解回调和所有这些,但我不确定为什么不阻止eventloop?回调可以与其他功能同时执行吗?我认为这将有助于我了解发送电子邮件的最佳行动方案,具体取决于是否会阻止任何内容并使其更加延迟。感谢所有的帮助,感谢那些可以帮助像我这样的初学者理解这些超级重要的Node概念的人。感谢。

1 个答案:

答案 0 :(得分:0)

您的问题没有提供有关您的Web应用程序的太多见解,但在这里我提到了一些对Node.js中的任何初学者来说非常重要的要点。

  • Node.js出现了事件驱动的编程概念,只有一个 单线程正在接受客户端连接和 跟踪回调(可能在调用堆栈中)。
  • 但事实是Node.js没有用单个线程实现。每当http连接进入图片时,就会自动为与之关联的任何cpu绑定操作分配4个线程。
  • 通常,所有i / o绑定操作都有与之关联的回调。因此,主循环一直等待事件(比如完成i / o绑定操作,例如读取文件的结束),并且每当有任何此类事件时,此循环都会触发回调被检测到。现在,这个主线程处理这个回调。
  • 虽然回调和事件似乎彼此非常相似,但存在细微差别,即 使用异步函数的结果调用回调函数,如下面的代码

var fs = require("fs");

fs.readFile('input.txt', function (err, data) {
   if (err) return console.error(err);
   console.log(data.toString());
});

console.log("Program Ended");

但事件循环实际上是在寻找任何事件,而不是像回调那样的所有情况的结果。事件可能像打开文件或关闭文件。下面给出了一个常见的事件用例:

    // Import events module
var events = require('events');


// Create an eventEmitter object
var eventEmitter = new events.EventEmitter();

// Create an event handler as follows
var connectHandler = function connected() {
   console.log('connection succesful.');

   // Fire the data_received event 
   eventEmitter.emit('data_received');
}

// Bind the connection event with the handler
eventEmitter.on('connection', connectHandler);

// Bind the data_received event with the anonymous function
eventEmitter.on('data_received', function(){
   console.log('data received succesfully.');
});

// Fire the connection event 
eventEmitter.emit('connection');

console.log("Program Ended.");

有关上述要点的详细说明,请再次阅读Node.js文档。