理解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 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.