Node.js 回調函數
Node.js 異步編程的直接體現就是回調。
異步編程依托於回調來實現,但不能說使用了回調後程序就異步化了。
回調函數在完成任務後就會被調用,Node 使用了大量的回調函數,Node 所有 API 都支持回調函數。
例如,我們可以一邊讀取文件,一邊執行其他命令,在文件讀取完成後,我們將文件內容作為回調函數的參數返回。這樣在執行代碼時就沒有阻塞或等待文件 I/O 操作。這就大大提高了 Node.js 的性能,可以處理大量的並發請求。
回調函數一般作為函數的最後一個參數出現:
function foo1(name, age, callback) { } function foo2(value, callback1, callback2) { }
阻塞代碼實例
創建一個文件 input.txt ,內容如下:
菜鳥教程官網地址:rb.wikimirror.xyz
創建 main.js 文件, 代碼如下:
var fs = require("fs"); var data = fs.readFileSync('input.txt'); console.log(data.toString()); console.log("程序執行結束!");
以上代碼執行結果如下:
$ node main.js 菜鳥教程官網地址:rb.wikimirror.xyz 程序執行結束!
非阻塞代碼實例
創建一個文件 input.txt ,內容如下:
菜鳥教程官網地址:rb.wikimirror.xyz
創建 main.js 文件, 代碼如下:
var fs = require("fs"); fs.readFile('input.txt', function (err, data) { if (err) return console.error(err); console.log(data.toString()); }); console.log("程序執行結束!");
以上代碼執行結果如下:
$ node main.js 程序執行結束! 菜鳥教程官網地址:rb.wikimirror.xyz
以上兩個實例我們了解了阻塞與非阻塞調用的不同。第一個實例在文件讀取完後才執行程序。 第二個實例我們不需要等待文件讀取完,這樣就可以在讀取文件時同時執行接下來的代碼,大大提高了程序的性能。
因此,阻塞是按順序執行的,而非阻塞是不需要按順序的,所以如果需要處理回調函數的參數,我們就需要寫在回調函數內。
醬油能
mar***wangjun@163.com
參考地址
阻塞和非阻塞,同步和異步是node.js裏經常遇到的詞彙,我舉個簡單的例子來說明:
我要看足球比賽,但是媽媽叫我燒水,電視機在客廳,燒水要在廚房。家裏有2個水壺,一個是普通的水壺,另一個是水開了會叫的那種水壺。我可以:
等著看球的我:阻塞
看著電視的我:非阻塞
普通水壺:同步
會叫的水壺:異步
所以,異步往往配合非阻塞,才能發揮出威力。
醬油能
mar***wangjun@163.com
參考地址
z宇發
zen***fayangchuyan@outlook.com
阻塞和非阻塞
1.阻塞:就像單線程cpu一樣,一個任務由多個小任務組成,但是隻能一個任務接一個任務流程的往想下走,誰在任務排序的前麵就誰先執行,執行完了進行下一個,如果遇到錯誤,下麵的小任務就不要做了,一直卡住。
2.非阻塞:就像多線程cpu一樣,一個任務由多個小任務組成,可以分開線程來做,哪個線程做分配到的任務,完成了對應的任務就行,某個線程的任務沒做完那就做報對應的錯,其他的不受影響。
z宇發
zen***fayangchuyan@outlook.com
小飛俠
136***858@qq.com
同步:同步就是你要做的事你列了一個清單,按照清單上的順序 一個一個執行
異步:就是可以同時幹好幾件事
阻塞:就是按照清單上的順序一件一件的往下走,當一件事沒有做完,下麵的事都幹不了
非阻塞:就是這件事沒有幹完,後麵的事不會等你這件事幹完了再幹,而是直接開始幹下一件事,等你這件事幹完了,後麵的事也幹完了,這樣就大大提高了效率
小飛俠
136***858@qq.com
Allen
292***0995@qq.com
參考地址
Allen
292***0995@qq.com
參考地址
ReLU.
bwu***sd.edu
基於新版本 ES 的語法糖,Node 的異步操作可以替換成以下兩種寫法。
1、Promise
2、async/await
ReLU.
bwu***sd.edu