[REST] callback function in node.js

不太確定放在此類別是否正確,
不過, 之前 node.js 的程式碼都歸於此類別,
也就先暫時這樣分類吧...
主要參考的內容如下:
http://larry850806.github.io/2016/06/16/nodejs-async/
https://www.tutorialspoint.com/nodejs/nodejs_callbacks_concept.htm


node.js 為平行化 (非同步) 架構,
因此, 當我們執行一個 function 時, 會先放入 event loop 中,
並在背景繼續執行其他程式流程, 如下圖所示:

此平行化架構, 不同於 c / java 按程式一行一行執行的架構,
node.js 可允許同時執行多項程式, 有利於利用多執行緒處理,
然而, 當一個程式需要另一個程式的結果時, 就需要 callback 來完成.
舉例來說:

var fs = require('fs');

// fs.readFile(filename, callback(err, content))

fs.readFile('test.txt', function(err, content){
    var str = content.toString();
    console.log(str.length);
    console.log('finish');
});

console.log('not finish');


此程式目的為讀一個檔案 (test.txt) 並顯示長度,
紅字部分為 callback 部分,
在這部分的程式將等到 readFile 執行完之後才會執行,
執行結果如下:

$ node callback.js
not finish
245
finish

我們可以看到先出現: not finish,
來自於最後一行的程式: console.log('not finish');
而在之後才是讀檔結果.

callback function 也讓我們需要重新適應 coding 的方式,
例如, 在過去寫 c / java 的時候, 我們可以寫一個 function:

function readtest() {
    count = 0;
    fs.readFile('test.txt', function(err, content) {
        var str = content.toString();
        console.log(str.length);
        count = str.length;
        console.log('finish');
    });
    return count;
}


但在 node.js 中, 執行此 function 的結果永遠是 0,
(因為在非同步架構下, 不會等 readFile 結束才 return count 數值)
此時, 就需要把和 count 相關的指令包在 readFile 的 callback 中,
才可以取用文字檔的長度資訊.

當然, 還有一些其他更進階的解法, 請參考:
https://stackoverflow.com/questions/23339907/returning-a-value-from-callback-function-in-node-js
https://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call


留言

熱門文章

LTE筆記: RSRP, RSSI and RSRQ

[WiFi] WiFi 網路的識別: BSS, ESS, SSID, ESSID, BSSID

LTE筆記: 波束成型 (beamforming) 和天線陣列