Node.js回調(diào)函數(shù):異步性是Node.js變得流行的基本因素之一。回調(diào)是函數(shù)異步的實(shí)現(xiàn)。一般來(lái)說(shuō),在 Node.js 中,大多數(shù)處理資源的函數(shù)都有回調(diào)變體。
當(dāng)為某個(gè)任務(wù)調(diào)用某個(gè)異步函數(shù)的資源時(shí),將立即讓該控件繼續(xù)執(zhí)行該函數(shù)后面的后續(xù)語(yǔ)句。資源上的任務(wù)將并行啟動(dòng)。這可以幫助 Node.js 繼續(xù)執(zhí)行其他任務(wù),而同時(shí)該函數(shù)正在使用該資源。一旦使用資源的任務(wù)完成,Node.js 將使用回調(diào)函數(shù)恢復(fù)。調(diào)用 Callback 函數(shù)時(shí)帶有參數(shù): 數(shù)據(jù)對(duì)象、結(jié)果對(duì)象和(或)包含任務(wù)相關(guān)信息的錯(cuò)誤對(duì)象。
阻塞函數(shù):與異步函數(shù)相反,同步函數(shù)將執(zhí)行塊,直到資源完成時(shí)才完成。 因此,同步函數(shù)也稱為阻塞函數(shù)。
Node.js嵌套的回調(diào)函數(shù) :如果對(duì)資源依次執(zhí)行多個(gè)操作,并且還必須異步進(jìn)行,則可以將回調(diào)函數(shù)彼此嵌套。
現(xiàn)在,在讀?。ㄈ蝿?wù))文件(資源)時(shí),我們將看到回調(diào)函數(shù)與阻塞函數(shù)相比的三種情況。
Node.js阻塞函數(shù)示例
Node.js回調(diào)函數(shù)示例
Node.js嵌套回調(diào)函數(shù)示例
以下是一個(gè)示例節(jié)點(diǎn)腳本,該腳本同步讀取sample.txt文件。
var fs = require('fs'); // 讀取文件sample.txt var data = fs.readFileSync('sample.txt'); console.log("Reading file completed : " + new Date().toISOString()); console.log("After readFileSync statement : " + new Date().toISOString());
當(dāng)上述程序運(yùn)行時(shí)
終端輸出
arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-sync.js Reading file completed : 2017-10-19T12:21:40.103Z After readFileSync statement : 2017-10-19T12:21:40.105Z
after readFileSync 語(yǔ)句總是在完成讀取文件后才執(zhí)行。 fs.readFileSync 阻塞了執(zhí)行流。
以下是示例節(jié)點(diǎn)腳本,該示例腳本借助Node.js回調(diào)函數(shù)異步讀取sample.txt文件。
var fs = require('fs'); // 讀取文件sample.txt fs.readFile('sample.txt', // 讀取文件完成時(shí)調(diào)用的回調(diào)函數(shù) function(err, data) { if (err) throw err; // 數(shù)據(jù)是包含文件內(nèi)容的緩沖區(qū) console.log("Reading file completed : " + new Date().toISOString()); }); console.log("After readFile asynchronously : " + new Date().toISOString());
當(dāng)上述程序運(yùn)行時(shí)
終端輸出
arjun@arjun-VPCEH26EN:~/nodejs$ node read-file-async.js After readFile asynchronously : 2017-10-19T12:25:36.982Z Reading file completed : 2017-10-19T12:25:36.987Z
您可能會(huì)注意到,即使在執(zhí)行 console.log 在 readFile 異步語(yǔ)句之后,完成對(duì)文件的讀取也需要大約5毫秒。file. fs.readFile('sample.txt', callback function{..}) 沒有阻塞執(zhí)行,而是與主控制流并行啟動(dòng)一個(gè)新進(jìn)程,以讀取文件(對(duì)資源執(zhí)行任務(wù))。
為了演示Node.js嵌套回調(diào)函數(shù),我們將考慮重命名文件然后使用異步函數(shù)將其刪除的方案。
var fs = require('fs'); fs.rename('sample.txt', 'sample_old.txt', // 第一回叫功能 function (err) { if (err) throw err; console.log('File Renamed.'); fs.unlink('sample_old.txt', // 第二次回叫功能 function (err) { if (err) throw err; console.log('File Deleted.'); } ); } );
當(dāng)上述Node.js示例與node一起運(yùn)行時(shí)
終端輸出
arjun@arjun-VPCEH26EN:~/nodejs$ node nodejs-nested-callback.js File Renamed. File Deleted.
在本Node.js教程– Node.js回調(diào)函數(shù)中,我們學(xué)習(xí)了回調(diào)函數(shù)的執(zhí)行流程以及它們?nèi)绾螌?shí)現(xiàn)非阻塞,以及如何將嵌套回調(diào)函數(shù)與示例結(jié)合使用。