
Chap1 Node.js基礎知識
同步呼叫、非同步呼叫
同步呼叫
是一種阻塞式呼叫,一段程式呼叫一段程式時,必須等待這段程式執行結束並傳回結果後,程式才會繼續執行下去。例如考試的時候:有的同學是這樣的一道題一道的往下做,當有一道題沒做出來時,絕對不會繼續做下去,這就如同同步呼叫的過程,一段邏輯沒有執行完成時,程式會一直等待,直到程式執行及結束,才執行下面的邏輯。下面我們看一下同步呼叫的PHP實例。
<?php
/**
* 檔案名稱:anser.php,PHP測試程式,應用程式說明同步呼叫思想
*/
class Person
{
public static $question = array(); //defined static parameters
public static function answer() {
echo "sucess";
}
public static function think() {
sleep(5);
return true;
}
}
$ret = Person::think();
if ($ret) {
Person::answer();
} else {
echo "answer wrong";
}
?>
非同步呼叫
是一種非阻塞式呼叫,一段非同步程式未執行完,可以繼續執行下一段程式邏輯,當程式執行完以後,透過回乎傳回繼續執行對應的邏輯,而不耽誤其程式執行。
舉例來說,一個經理拿到工作,他可以將工作同時分配給多個人去完成,而下屬完成後將結過回饋給他,當他接到所有回饋後就表明該工作完成了。經理分配工作給員工完成工作就相當於一個非同步執行程式執行過程,每個員工之間是不會相互阻礙的,當員工完成時,他會告知經理"我已經完成工作了"。這整個工作執行就是一個非同步執行的過程。
下面實例的非同步呼叫方法,程式先執行think方法,當think方法沒有結束時,程式會繼續執行answer方法,當think方法結束時,透過回呼函數執行對應邏輯。
**
* 檔案名稱:answer.js,Node.js測試程式,應用程式說明非同步呼叫思想
*/
function Person() {
this.think = function(callback) {
setTimeout(function() {console.log('thinking~~~!');callback()},5000);
}
this.answer = function() {
console.log('I am answer other question');
}
}
var person = new Person();
person.think(function() {
console.log('tinking 5 seconds, get the right answer!')
});
person.answer();
[程式說明]
Person:Person是一個類別,其中有兩個方法think和answer。
think非同步方法:非同步等待思考5秒鐘,思考結束後輸出'thinking~~~'同時執行callback()函數。
answer方法:輸出正在解答其他問題'I am answering other question'。
回呼和非同步呼叫
首先明確一點,回呼並非是非同步呼叫,回呼是一種解決非同步函數執行結果的處理方法。在非同步呼叫,如果我們希望將執行的結果傳回並且處理時,可以透過回呼的方法解決。
/*
*檔案名稱:callback.js ,說明非非同步介面呼叫的Node.js程式執行過程同樣是同步
*/
function waitFive(name, function_name) {
var pus=0;
var currentDate = new Date();
while(pus<5000) { //等待5秒
var now = new Date();
pus = now - currentDate;
}
function_name(name); //執行回呼函數
}
function echo (name) {
console.log(name);
}
waitFive("danhaung", echo) ;
console.log("lts over");
[程式說明]
waiFive():同步函數,邏輯是等待5秒鐘後,執行一個回呼函數。
echo ()函數方法:輸出name資訊。
取得非同步函數的執行結果
非同步函數常常不是直接回傳執行結果,而是透過事件驅動方式,將執行結果傳回到回呼函數中,之後再回呼函數中處理對應的邏輯程式。大家可以在官網看到很多API,都是透過非同步回呼方式來呼叫。
Chat2 模組和NPM
NPM簡介
Node Packaged Modules(簡稱NPM),是Node.js的套件管理員,也可以說是Node.js的函數庫。
安裝NPM
*windows
系統會預設安裝NPM
*linux
curl http://npmjs.org/install.sh | sudo sh
安裝 Express 框架
npm install module(模組名稱)
移除方法
npm uninstall module
Jade 模板
jade是一款高性能、簡潔容易的模板引擎。為什麼需要jade模板?Node.js和PHP、Java不同,後兩者都可以內嵌程式的html頁面中。
npm install jade
exports 和 module.exports
exports和module.exports的作用都是將檔案模組的方法和屬性暴露給require傳回的物件進行呼叫。但是兩者的差異,exports的屬性和方法都可以被module.exports替代,以下面的程式,其作用都是一致的。
exports.myname = 'wwesbake' 和 module.exports.myname = 'wwesbake'
但是exports不能替代module.exports方法,可以視為包含關係。所有的exports物件最後都是透過module.exports傳遞執行,因此可以更確切地說,exports是替module.exports增加屬性和方法。程式如下:
exports.name = "aa";
exports.happy = function(){console.log("mm")};
console.log(module.exports);
[程式說明]
export.name = "aa":使用exports將name屬性暴露給requie傳回物件。
exports.happy = function(){console.log("mm")}:使用exports將方法happy暴露給require傳回物件。
執行以上的程式傳回以下結果:
{name:'aa', happy:[function]}