輕松創(chuàng)建nodejs服務(wù)器(8):非阻塞是如何實現(xiàn)的
這節(jié)我們來了解一下nodejs實現(xiàn)非阻塞操作的方法。
我們先來修改一下 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;
這段代碼,創(chuàng)建了一個新的變量content(初始值為“empty”),執(zhí)行“l(fā)s -lah”命令,將結(jié)果賦值給content,最后將content返回。
我們引入了一個新的Node.js模塊,child_process,之所以用它,是為了實現(xiàn)一個既簡單又實用的非阻塞操作:exec()。
那么exec()做了什么呢?
它從Node.js來執(zhí)行一個shell命令。在上面的例子里,我們用它來獲取當前目錄下所有的文件(“l(fā)s -lah”),然后,當/startURL請求的時候?qū)⑽募畔⑤敵龅綖g覽器中。
我們啟動服務(wù)器,訪問“http://localhost:8888/start”我們會發(fā)現(xiàn)頁面輸出的內(nèi)容是 empty。
exec()發(fā)揮作用了,有了它,我們可以執(zhí)行非常耗時的shell操作而無需迫使我們的應用停下來等待該操作。
雖然如此,但是頁面輸出的內(nèi)容似乎不是我們想要的結(jié)果。
我們來分析一下原因:
我們的代碼是同步執(zhí)行的,這就意味著在調(diào)用exec()之后,Node.js會立即執(zhí)行 return content ;
在這個時候,content仍然是“empty”,因為傳遞給exec()的回調(diào)函數(shù)還未執(zhí)行到——因為exec()的操作是異步的。
下一節(jié)我們將介紹如何解決這個問題。
相關(guān)文章
用C/C++來實現(xiàn) Node.js 的模塊(二)
上篇文章的主要內(nèi)容講訴了用C/C++來實現(xiàn) Node.js 的模塊,本文更深一步繼續(xù)探討這個問題,有需要的朋友可以參考下2014-09-09
基于socket.io+express實現(xiàn)多房間聊天
本文給大家分享的是使用node.js,基于socket.io+express實現(xiàn)多房間聊天的代碼,非常的實用,有需要的小伙伴可以來參考下2016-03-03
Nodejs使用dgram模塊創(chuàng)建UDP服務(wù)詳解
這篇文章主要為大家介紹了Nodejs使用dgram模塊創(chuàng)建UDP服務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10
Node中完整的?node?addon?實現(xiàn)流程
這篇文章主要介紹了Node中完整的node?addon實現(xiàn)流程,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下2022-09-09

