理解Node.js中代码执行的阻塞和非阻塞
现在,我们有一个在fs模块中的writeFileSync文件写入函数,如下所示:
const requestBody = [];
req.on('data', (chunks)=>{
requestBody.push(chunks);
});
return req.on('end', ()=>{
const parsedData = Buffer.concat(requestBody).toString();
const username = parsedData.split('=')[1];
fs.writeFileSync('username.txt', username);
//redirect res.statusCode=302;
res.setHeader('Location','/');
return res.end();
});Sync表示同步。这是一个阻塞代码示例。只有在文件写入完成后,文件的其余代码执行才会开始。上面的代码比较简单,但是如果我们有一个大型的文件处理操作,它会导致应用程序性能下降。
这种代码执行方式会减慢其他请求的速度,最终影响应用程序的性能。
解决这个问题的方法是使用文件的异步写入函数。我们在fs模块中有writeFile函数,它是异步的。下面是一个例子:
return req.on('end', ()=>{
const parsedData = Buffer.concat(requestBody).toString();
const username = parsedData.split('=')[1];
fs.writeFile('username.txt', username, (error)=>{
console.log(error);
});
//redirect res.statusCode=302;
res.setHeader('Location','/');
return res.end();
});writeFile函数多接收一个参数,即错误对象。如果在完成文件处理函数时出现任何错误,我们可以在控制台中检查该错误。
这样我们就可以避免代码阻塞。在文件处理中,Node.js可以使用操作系统的多线程方法来提高性能。它只是注册事件并在以后的特定点执行它们。
异步是Node.js中处理操作最常用的方式,例如从服务器获取数据、操作数据、分页等。
readFile和readFileSync:
与writeFile函数类似,我们也有readFile文件读取函数,它们也分为阻塞和非阻塞方式。
readFile是非阻塞的,readFileSync是阻塞的。我们可以使用Promise来处理尚未完成但完成后会返回resolve的操作。
PromiseOperationFunction() .then( ()=> console.log(‘completed with succes’); ) .catch((err)=> console.log(‘completed with failure’); );
广告
数据结构
网络
关系数据库管理系统(RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP