📜  异步函数和 Node.js 事件循环

📅  最后修改于: 2022-05-13 01:56:45.907000             🧑  作者: Mango

异步函数和 Node.js 事件循环

异步函数

每个人都知道 JavaScript 本质上是异步的,Node.js 也是如此。 Node 背后的基本原理是应用程序在单个线程或进程上执行,因此事件是异步处理的。

如果我们考虑任何典型的 Web 服务器,如 Apache,它需要为每个进程提供单独的线程,直到请求得到满足。使用多线程的缺点是它们不是内存密集型的并且不能很好地扩展。另外,我们必须确保每个进程必须是线程安全的,并且不应该出现死锁。

但是 Node 做的事情不同。在启动 Node 应用程序时,它只创建一个执行线程。当节点接收到请求时,它会将线程分配给该进程,并且在它完成处理当前请求的代码之前不能处理其他请求。因此,Node 使用事件循环和回调函数同时处理多个请求。事件循环是一种基本上轮询特定事件并在需要时调用事件处理程序的功能。回调函数是 Node 中的此事件处理程序。

在 Node 应用程序中,Node 发起请求,但不会在请求周围等待以获取响应。取而代之的是,它为请求附加了一个回调函数。当请求已完成或请求已收到响应时,回调函数会发出一个事件以对请求的操作的结果或请求的资源执行某些操作。

如果多个人同时访问一个 Node 应用程序,并且该应用程序需要访问文件中的资源,Node 会在每个请求中附加一个回调函数。一旦资源可用于该特定请求,就会为每个人的请求调用回调函数。 Node 可以同时处理其他请求。

Node 应用程序中并行请求的服务取决于应用程序的繁忙程度以及它的设计方式?

例子:

// Normal Function
function add(a,b){
    return a+b;
}
  
// Async Function
async function asyncadd(a,b){
    Return a+b;
}

异步打开和写入文件的内容

// load http module
var http = require('http');
var fs = require('fs');
  
// load http module
var http = require('http');
var fs = require('fs');
  
// create http server
http.createServer(function (req, res) {
  
        // open and read in helloworld.js
        fs.readFile('helloworld.js', 'utf8', function(err, data) {
  
        res.writeHead(200, {'Content-Type': 'text/plain'});
        if (err)
            res.write('Could not find or open file for reading\n');
        else
  
            // if no error, writing JS file to a client
            res.write(data);
            res.end();
            });
}).listen(8124, function() { console.log('bound to port 8124');});
  
console.log('Server running on 8124/');