NodeJS 基礎(chǔ)教程

NodeJS Express.js

NodeJS 緩沖&URL

NodeJS MySql

NodeJS MongoDB

NodeJS 文件(FS)

NodeJS 其他

Node.js 回調(diào)函數(shù)

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ù)示例

阻塞函數(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í)行流。

Node.js回調(diào)函數(shù)示例

以下是示例節(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ù)示例

為了演示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.

結(jié)論:

在本Node.js教程– Node.js回調(diào)函數(shù)中,我們學(xué)習(xí)了回調(diào)函數(shù)的執(zhí)行流程以及它們?nèi)绾螌?shí)現(xiàn)非阻塞,以及如何將嵌套回調(diào)函數(shù)與示例結(jié)合使用。

丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清