最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Node.js基礎(chǔ)入門(mén)之回調(diào)函數(shù)及異步與同步詳解

 更新時(shí)間:2022年03月21日 15:05:14   作者:小六公子  
Node.js是一個(gè)基于Chrome?V8引擎的JavaScript運(yùn)行時(shí)。類(lèi)似于Java中的JRE,.Net中的CLR。本文將詳細(xì)為大家介紹Node.js中的回調(diào)函數(shù)及異步與同步,感興趣的可以了解一下

經(jīng)過(guò)前面兩天的學(xué)習(xí),已經(jīng)對(duì)Node.js有了一個(gè)初步的認(rèn)識(shí),今天繼續(xù)學(xué)習(xí)其他內(nèi)容,并加以整理分享,如有不足之處,還請(qǐng)指正。

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

1. 什么是回調(diào)函數(shù)?

回調(diào)函數(shù),或簡(jiǎn)稱(chēng)回調(diào)【callback】將一個(gè)A函數(shù)作為參數(shù)傳入另一個(gè)B函數(shù)中,B函數(shù)在執(zhí)行過(guò)程中,根據(jù)時(shí)機(jī)或條件決定是否調(diào)用A函數(shù),A函數(shù)就是B函數(shù)的回調(diào)函數(shù)。

2. 回調(diào)函數(shù)實(shí)現(xiàn)機(jī)制

回調(diào)函數(shù)的實(shí)現(xiàn)機(jī)制如下所示:

  • 定義一個(gè)回調(diào)函數(shù)(普通函數(shù));
  • 將回到函數(shù)的引用地址作為參數(shù)傳遞給調(diào)用者;
  • 當(dāng)特定的事件或條件發(fā)生時(shí),調(diào)用者使用函數(shù)指針調(diào)用回調(diào)函數(shù)對(duì)事件進(jìn)行處理。

3. 回調(diào)函數(shù)用途

回調(diào)函數(shù)在JavaScript中使用非常多,最簡(jiǎn)單的場(chǎng)景就是事件注冊(cè)或異步函數(shù)。如:當(dāng)用戶點(diǎn)擊某個(gè)按鈕時(shí),需要做出相應(yīng)的響應(yīng),那么就會(huì)用到回調(diào)函數(shù)。

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

以常用的setInterval為例,就是將show作為參數(shù)傳遞給setInverval,所以show就是setInterval的回調(diào)函數(shù),如下所示:

 function show(){
     console.log("今天星期三,又是快樂(lè)的一天");
 }
 setInterval(show,1000);

執(zhí)行結(jié)果,如下所示:

關(guān)于setInterval的參數(shù)說(shuō)明,如下所示:

異步與同步

1. 什么是異步與同步?

同步:一個(gè)任務(wù)等待前一個(gè)任務(wù)結(jié)束,然后再執(zhí)行,程序的執(zhí)行順序與任務(wù)的排列順序是一致的,同步的。

異步:每一個(gè)任務(wù)有一個(gè)或多個(gè)回調(diào)函數(shù)(callback),前一個(gè)任務(wù)結(jié)束后,不是執(zhí)行后一個(gè)任務(wù),而是執(zhí)行回調(diào)函數(shù),后一個(gè)任務(wù)則是不等前一個(gè)任務(wù)結(jié)束就開(kāi)始執(zhí)行,所以程序的執(zhí)行順序與任務(wù)的排列順序是不一致的,異步的。

2. 同步示例

同步即按順序執(zhí)行,存在先后順序,如下所示:

console.log("1111");
console.log("2222");
console.time("t1");
for(var i=0;i<1000000;i++){

}
console.timeEnd("t1");
console.log("3333");

同步執(zhí)行結(jié)果,如下所示:

3. 異步示例一

異步則是采用回調(diào)函數(shù)執(zhí)行,如下所示:

console.log("1111");
console.log("2222");
setTimeout(function(){
    console.time("t1");
    for(var i=0;i<1000000;i++){

    }
    console.timeEnd("t1");
},1000);
console.log("3333");

示例執(zhí)行結(jié)果,如下所示:

4. 異步示例二

即使主線程位于阻塞當(dāng)中,異步回調(diào)函數(shù)也要等待主線程執(zhí)行完成后再執(zhí)行。如下所示:

console.log("1111");
console.log("2222");
setTimeout(function(){
    console.log("2222-3333");
},15);
console.time("t1");
for(var i=0;i<100000000;i++){

}
console.timeEnd("t1");
console.log("3333");

示例執(zhí)行結(jié)果

關(guān)于setTimeOut和setInterval的注意事項(xiàng),如下所示:

  • setTimeOut和setInterval兩個(gè)函數(shù)是同步執(zhí)行,但是函數(shù)的回調(diào)函數(shù)參數(shù)是定時(shí)器異步執(zhí)行。
  • setTimeOut和setInterval兩個(gè)函數(shù)的最小時(shí)間間隔為10-15ms,即使設(shè)置成0,也是如此。
  • 異步函數(shù)的執(zhí)行時(shí)間,永遠(yuǎn)在同步執(zhí)行完之后再執(zhí)行。

關(guān)于主線程和任務(wù)線程的執(zhí)行順序,可參考下圖:

異步的實(shí)現(xiàn)

在Node.js中,異步共有三種實(shí)現(xiàn)方式:

  • 回調(diào)函數(shù),回調(diào)函數(shù)不一定是異步,但是異步一定有回調(diào)函數(shù)。
  • 事件【基于回調(diào)】
  • Promise【ES6新增】

1. 回調(diào)函數(shù)的同步示例

回調(diào)函數(shù)也可能是同步的,如下所示:

 console.log("1111");
 var arr=[1,2,3,4];
 arr.forEach(function(v,i){
     console.log(v);
 });
 console.log("2222");

示例執(zhí)行結(jié)果

2. 異步事件示例

定義一個(gè)服務(wù),當(dāng)請(qǐng)求時(shí),返回對(duì)應(yīng)的信息。如下所示:

var http=require("http");
var server=http.createServer();
server.on('request',function(req,res){
    res.writeHead(200,{"Content-Type":'text/html;charset=utf-8'});
    res.write("<h1>你正在訪問(wèn)小六子的服務(wù)器</h1>");
    res.end();
});
server.listen(8080,function(){
    console.log("服務(wù)已啟動(dòng)");
});

3. 異步示例截圖

當(dāng)服務(wù)啟動(dòng)時(shí),如下所示:

當(dāng)發(fā)起請(qǐng)求時(shí),返回信息如下所示:

Promise基礎(chǔ)

1. 什么是Promise ?

Promise(承諾)就是一個(gè)對(duì)象,用來(lái)傳遞異步操作的消息。它代表了某個(gè)未來(lái)才會(huì)知道的結(jié)果的事件(通常是一個(gè)異步操作),并且這個(gè)事件提供統(tǒng)一的API,可供進(jìn)一步處理。

2. Promise特點(diǎn)

Promise對(duì)象有以下兩個(gè)特點(diǎn):

  • 對(duì)象的狀態(tài)不受外界影響。Promise對(duì)象代表一個(gè)異步操作,有三種狀態(tài):Pending(進(jìn)行中),Resolved(已完成,又稱(chēng)FulFilled)和Rejected(已失敗)。只有異步操作的結(jié)果,可以決定當(dāng)前是哪一種狀態(tài),任何其他操作都無(wú)法改變這個(gè)狀態(tài)。
  • 一旦狀態(tài)改變,就不會(huì)再變,任何時(shí)候都可以得到這個(gè)結(jié)果。Promise對(duì)象的狀態(tài)改變,只有兩種可能:從Pending變?yōu)镽esolved和從Pending變?yōu)镽ejected。只要這兩種情況發(fā)生,狀態(tài)就不會(huì)再變了,會(huì)一直保持這種結(jié)果。如果改變已經(jīng)發(fā)生了,你再對(duì)Promise對(duì)象添加回調(diào)函數(shù),也會(huì)立即得到這個(gè)結(jié)果。這與事件(Event)完全不同,事件的特點(diǎn)是,如果你錯(cuò)過(guò)了它,再去監(jiān)聽(tīng),是得不到結(jié)果的。

3. 異步的缺點(diǎn)

異步的執(zhí)行順序和時(shí)間是不可控的,如下所示:

假如現(xiàn)在有兩個(gè)文件file1.txt,file2.txt,如下所示:

這兩個(gè)文件是有先后順序的,然后依次進(jìn)行讀取,代碼如下所示:

var fs =require("fs");

fs.readFile("./file1.txt",function(err,data){
    console.log(data.toString());
});

fs.readFile("./file2.txt",function(err,data){
    console.log(data.toString());
});

示例結(jié)果如下所示:

通過(guò)以上示例不難發(fā)現(xiàn),每次運(yùn)行得到的結(jié)果不完全相同,有時(shí)與我們預(yù)期的結(jié)果并不一致,這就是異步的不可控性。那么如何解決呢?

4. Promise保證異步順序

通過(guò)Promise可以保證異步執(zhí)行的順序,如下所示:

var p1 = new Promise(function(resolve,reject){
    fs.readFile("./file1.txt",function(err,data){
        if(err){
            reject(err);
        }else{
            resolve(data.toString());
        }
    });
});

var p2 = new Promise(function(resolve,reject){
    fs.readFile("./file2.txt",function(err,data){
        if(err){
            reject(err);
        }else{
            resolve(data.toString());
        }
    });
});
//通過(guò)數(shù)組中的順序,控制異步輸出的順序
Promise.all([p1,p2]).then(function(datas){
    console.log(datas);
},function(errs){
    console.log(errs);
});

優(yōu)化后的結(jié)果,如下所示:

通過(guò)以上示例發(fā)現(xiàn),Promise可以通過(guò)消息的傳遞,保證異步操作的順序。

到此這篇關(guān)于Node.js基礎(chǔ)入門(mén)之回調(diào)函數(shù)及異步與同步詳解的文章就介紹到這了,更多相關(guān)Node.js回調(diào)函數(shù) 同步異步內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • nodejs教程之入門(mén)

    nodejs教程之入門(mén)

    本文是nodejs教程系列的入門(mén)篇,主要講述nodejs的特點(diǎn)、模塊機(jī)制/CommonJs(模塊引用、模塊定義、模塊標(biāo)識(shí)、模塊實(shí)現(xiàn))、包與NPM等知識(shí),非常的詳細(xì),這里推薦給大家作為入門(mén)的文章。
    2014-11-11
  • electron原理,以及electron生成可執(zhí)行文件的方法實(shí)例分析

    electron原理,以及electron生成可執(zhí)行文件的方法實(shí)例分析

    這篇文章主要介紹了electron原理,以及electron生成可執(zhí)行文件的方法,結(jié)合實(shí)例形式分析了electron原理以及electron生成可執(zhí)行文件的具體操作步驟、實(shí)現(xiàn)方法與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2023-04-04
  • Node.js中的不安全跳轉(zhuǎn)如何防御詳解

    Node.js中的不安全跳轉(zhuǎn)如何防御詳解

    安全是不容忽視的,每個(gè)開(kāi)發(fā)者都知道它非常重要,真正嚴(yán)肅對(duì)待它的卻沒(méi)有幾人。下面這篇文章主要給大家介紹了關(guān)于Node.js中不安全跳轉(zhuǎn)如何防御的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì)。需要的朋友可以參考下
    2018-10-10
  • 解決node終端下運(yùn)行js文件不支持ES6語(yǔ)法

    解決node終端下運(yùn)行js文件不支持ES6語(yǔ)法

    這篇文章主要介紹了解決node終端下運(yùn)行js文件不支持ES6語(yǔ)法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Node.js與PHP、Python的字符處理性能對(duì)比

    Node.js與PHP、Python的字符處理性能對(duì)比

    因?yàn)楹罄m(xù)考慮實(shí)現(xiàn) Fl 引擎的Node.js版本,所以對(duì)比了下Node.js和PHP的字符處理性能。發(fā)現(xiàn)Node.js真是甩了PHP幾條街啊,再測(cè)試了下Python,比PHP還慢。
    2014-07-07
  • Node.js HTTP服務(wù)器中的文件、圖片上傳的方法

    Node.js HTTP服務(wù)器中的文件、圖片上傳的方法

    這篇文章主要介紹了Node.js HTTP服務(wù)器中的文件、圖片上傳的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • 使用Node.js給圖片加水印的方法

    使用Node.js給圖片加水印的方法

    使用Node.js給圖片加水印,首先要確保本地安裝了node環(huán)境。然后,我們進(jìn)行圖像編輯操作需要用到一個(gè)Node.js的庫(kù):images。具體詳情大家可以通過(guò)本文了解下
    2016-11-11
  • node.js中的fs.closeSync方法使用說(shuō)明

    node.js中的fs.closeSync方法使用說(shuō)明

    這篇文章主要介紹了node.js中的fs.closeSync方法使用說(shuō)明,本文介紹了fs.closeSync方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • node.js卸載與安裝超詳細(xì)步驟記錄

    node.js卸載與安裝超詳細(xì)步驟記錄

    這篇文章主要介紹了如何卸載和重新安裝Node.js,包括卸載步驟、刪除相關(guān)文件、修改系統(tǒng)環(huán)境變量,以及安裝步驟、驗(yàn)證安裝和配置環(huán)境變量,需要的朋友可以參考下
    2025-02-02
  • NVM安裝nodejs的方法實(shí)用步驟

    NVM安裝nodejs的方法實(shí)用步驟

    安裝node的方式有很多種,本文主要介紹了NVM安裝nodejs的方法實(shí)用步驟,希望能幫助大家來(lái)解決問(wèn)題,感興趣的小伙伴們可以參考一下
    2019-01-01

最新評(píng)論

北流市| 清新县| 廊坊市| 三江| 广水市| 平山县| 寿宁县| 苍溪县| 南城县| 广汉市| 广西| 隆德县| 和平区| 乌海市| 抚顺市| 呼伦贝尔市| 沙湾县| 万荣县| 历史| 观塘区| 台中县| 吕梁市| 孟连| 毕节市| 古蔺县| 建宁县| 闵行区| 昌吉市| 怀化市| 涟水县| 呼图壁县| 石泉县| 德化县| 旬阳县| 定安县| 于都县| 望江县| 忻州市| 册亨县| 七台河市| 南宫市|