回調(diào)函數(shù)

nodejs異步編程的體現(xiàn)就是回調(diào)
異步編程依托于回調(diào)來實現(xiàn),但不能說使用了回調(diào)后程序就異步化了。
回調(diào)函數(shù)在完成任務(wù)后就會被調(diào)用,Node使用了大量的回調(diào)函數(shù),Node所有的API都支持回調(diào)函數(shù)。
例如,我們可以一邊讀取文件,一邊執(zhí)行其他命令,在文件讀取完后,我們將文件內(nèi)容作為回調(diào)函數(shù)的參數(shù)返回。

fs是文件系統(tǒng)模塊,同時提供了異步和同步的方法

阻塞代碼

創(chuàng)建一個文件 input.txt,內(nèi)容如下:
hello
創(chuàng)建main.js文件,代碼如下

var fs = require('fs');
var data = fs.readFileSync('input.txt');
console.log(data.toString());
console.log("程序執(zhí)行結(jié)束!");

以上代碼執(zhí)行結(jié)果如下:

$ node main.js
hello
程序執(zhí)行結(jié)束!

同步操作的好處是代碼簡單,缺點是程序?qū)⒌却齀O操作,在等待時間內(nèi),無法響應(yīng)其他任何事件。而異步讀取不需要等待IO操作,但代碼比較麻煩。

非阻塞代碼

創(chuàng)建一個文件 input.txt,內(nèi)容如下:
hello
創(chuàng)建main.js文件,代碼如下

var fs = require('fs');
fs.readFile('input.txt', 'utf-8', function (err, data) {
  if(err) {
    console.log(err);
  }else {
    console.log(data);
  }
});
console.log("程序執(zhí)行結(jié)束!");

以上代碼執(zhí)行結(jié)果如下:

$ node main.js
程序執(zhí)行結(jié)束!
hello

注意:input.txt文件必須在當(dāng)前目錄下,且文件編碼為utf-8.
異步讀取時,傳入的回調(diào)函數(shù)接受兩個參數(shù),當(dāng)正常讀取時,err參數(shù)為null,data參數(shù)為讀取到的string。當(dāng)讀取發(fā)生錯誤時,err參數(shù)代表一個錯誤對象,dataundefined。這也是Nodejs標準的回調(diào)函數(shù):第一個參數(shù)代表錯誤信息,第二個參數(shù)代表結(jié)果。

如果讀取的文件不是文本文件,而是二進制呢?

下面是讀取一個圖片的代碼

var fs = require('fs');
fs.readFile('sample.png', function(err, data) {
  if(err) {
    console.log(err);
  }else {
    console.log(data);
    console.log(data.length + 'bytes');
  }
});

當(dāng)讀取二進制文件時,不傳入文件編碼時,回調(diào)函數(shù)的data參數(shù)將返回一個Buffer對象。在Node.js中,Buffer對象就是一個包含零個或任意個字節(jié)的數(shù)組(和Array不同)。
Buffer對象可以和String相互轉(zhuǎn)換,例如把一個Buffer對象轉(zhuǎn)換成String:

// Buffer -> String
var text = data.toString('utf-8');

或者把一個String轉(zhuǎn)換成Buffer

// String -> Buffer
var buf = Buffer.from(text, 'utf-8');
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 callback,大家都知道是回調(diào)函數(shù)的意思。如果讓你舉些callback的例子,我相信你可以舉出一堆。但c...
    卓三陽閱讀 117,580評論 3 35
  • 首先,回調(diào)函數(shù)一點都不復(fù)雜,也一點都不難。 一、定義: 回調(diào)函數(shù)是從一個叫函數(shù)式編程的范式中衍生出來的。簡單來說,...
    chihei閱讀 1,290評論 1 11
  • <!DOCTYPE html> 回調(diào)函數(shù) box1 asdfsdfsdafsdfs // ...
    常連海閱讀 532評論 0 0
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 【同讀一本書】2016-8-17-103 —《不抱怨的世界》 那如果我不想等呢?說不定我如果大聲抱怨,...
    徐猛_Merlin閱讀 505評論 0 0

友情鏈接更多精彩內(nèi)容