首頁  >  文章  >  web前端  >  輕鬆建立nodejs伺服器(8):非阻塞是如何實作的_node.js

輕鬆建立nodejs伺服器(8):非阻塞是如何實作的_node.js

WBOY
WBOY原創
2016-05-16 16:25:511082瀏覽

這節我們來了解nodejs實作非阻塞操作的方法。

我們先來修改一下 start的處理程序:

複製程式碼 程式碼如下:

var exec = require("child_process").exec;
function start() {
  console.log("Request handler 'start' was called.");
  var content = "empty";
  exec("ls -lah", function (error, stdout, stderr) {
 content = stdout;
  });
  return content;
}
 
function upload() {
  console.log("Request handler 'upload' was called.");
  return "Hello Upload";
}
 
exports.start = start;
exports.upload = upload;

這段程式碼,建立了一個新的變數content(初始值為「empty」),執行「ls -lah」指令,將結果賦值給content,最後將content回傳。

我們引入了一個新的Node.js模組,child_process,之所以用它,是為了實現一個既簡單又實用的非阻塞操作:exec()。

那麼exec()做了什麼呢?

它從Node.js來執行一個shell指令。在上面的例子裡,我們用它來獲取當前目錄下所有的文件(“ls -lah”),然後,當/startURL請求的時候將文件資訊輸出到瀏覽器中。

我們啟動伺服器,造訪「http://localhost:8888/start」我們會發現頁面輸出的內容是 empty。

exec()發揮作用了,有了它,我們可以執行非常耗時的shell操作而無需迫使我們的應用停下來等待該操作。

雖然如此,但頁面輸出的內容似乎不是我們想要的結果。

我們來分析一下原因:

我們的程式碼是同步執行的,這表示在呼叫exec()之後,Node.js會立即執行 return content ;

在這個時候,content仍然是“empty”,因為傳遞給exec()的回呼函數還未執行到——因為exec()的操作是異步的。

下一節我們將介紹如何解決這個問題。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn