理解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’); );

更新于:2020年5月13日

465 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告