异步函数和节点事件循环
异步函数
每个人都知道 JavaScript 本质上是异步的,Node.js 也是如此。 Node 背后的基本原理是应用程序在单个线程或进程上执行,因此事件是异步处理的。
如果我们考虑像 Apache 这样的任何典型 Web 服务器,它需要为每个进程使用单独的线程,直到请求得到满足。使用多线程的缺点是它们不是内存密集型的,并且不能很好地扩展。此外,我们必须确保每个进程都必须是线程安全的,不应出现死锁。
但是 Node 的做法不同。在启动 Node 应用程序时,它只创建一个执行线程。当 Node 收到请求时,它会将线程分配给该进程,并且在完成处理当前请求的代码之前不能处理其他请求。因此,Node 通过使用事件循环和回调函数来同时处理多个请求。事件循环是一种功能,它基本上轮询特定事件并在需要时调用事件处理程序。回调函数是Node.js中的这个事件处理程序。
在 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/');