亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Node.js基礎入門之回調函數(shù)及異步與同步詳解

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

經過前面兩天的學習,已經對Node.js有了一個初步的認識,今天繼續(xù)學習其他內容,并加以整理分享,如有不足之處,還請指正。

回調函數(shù)

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

回調函數(shù),或簡稱回調【callback】將一個A函數(shù)作為參數(shù)傳入另一個B函數(shù)中,B函數(shù)在執(zhí)行過程中,根據(jù)時機或條件決定是否調用A函數(shù),A函數(shù)就是B函數(shù)的回調函數(shù)。

2. 回調函數(shù)實現(xiàn)機制

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

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

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

回調函數(shù)在JavaScript中使用非常多,最簡單的場景就是事件注冊或異步函數(shù)。如:當用戶點擊某個按鈕時,需要做出相應的響應,那么就會用到回調函數(shù)。

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

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

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

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

關于setInterval的參數(shù)說明,如下所示:

異步與同步

1. 什么是異步與同步?

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

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

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í)行結果,如下所示:

3. 異步示例一

異步則是采用回調函數(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í)行結果,如下所示:

4. 異步示例二

即使主線程位于阻塞當中,異步回調函數(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í)行結果

關于setTimeOut和setInterval的注意事項,如下所示:

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

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

異步的實現(xiàn)

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

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

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

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

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

示例執(zhí)行結果

2. 異步事件示例

定義一個服務,當請求時,返回對應的信息。如下所示:

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>你正在訪問小六子的服務器</h1>");
    res.end();
});
server.listen(8080,function(){
    console.log("服務已啟動");
});

3. 異步示例截圖

當服務啟動時,如下所示:

當發(fā)起請求時,返回信息如下所示:

Promise基礎

1. 什么是Promise ?

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

2. Promise特點

Promise對象有以下兩個特點:

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

3. 異步的缺點

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

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

這兩個文件是有先后順序的,然后依次進行讀取,代碼如下所示:

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());
});

示例結果如下所示:

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

4. Promise保證異步順序

通過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());
        }
    });
});
//通過數(shù)組中的順序,控制異步輸出的順序
Promise.all([p1,p2]).then(function(datas){
    console.log(datas);
},function(errs){
    console.log(errs);
});

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

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

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

相關文章

  • 使用 Node.js 對文本內容分詞和關鍵詞抽取

    使用 Node.js 對文本內容分詞和關鍵詞抽取

    這篇文章主要介紹了使用 Node.js 對文本內容分詞和關鍵詞抽取,需要的朋友可以參考下
    2017-05-05
  • 查詢Node.js版本信息的六種方法

    查詢Node.js版本信息的六種方法

    隨著應用程序規(guī)模越來越龐大,Node.js版本的更新也日益頻繁,本文主要介紹了查詢Node.js版本信息的六種方法,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • NodeJs讀取JSON文件格式化時的注意事項

    NodeJs讀取JSON文件格式化時的注意事項

    本文是作者在進行NodeJs開發(fā)時偶然發(fā)現(xiàn)的問題,經過一番努力,最終找到解決方案,分享給大家,有需要的小伙伴可以參考下
    2016-09-09
  • 詳解如何查看node端口被占用并殺死

    詳解如何查看node端口被占用并殺死

    這篇文章主要給大家介紹了如何查看node端口被占用并殺死,文中給出了相關的解決方法,并通過代碼示例給大家介紹的非常詳細,對前端開發(fā)要學會如何查看端口占用并殺死非常有用,需要的朋友可以參考下
    2024-01-01
  • Node.JS中事件輪詢(Event Loop)的解析

    Node.JS中事件輪詢(Event Loop)的解析

    對NodeJs的事情輪詢機造一孔之見。查閱了些許材料后,總算掀開了其神奇的里紗。下面這篇文章主要介紹了Node.JS中事件輪詢(Event Loop)的相關資料,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-02-02
  • 通過實例了解Nodejs模塊系統(tǒng)及require機制

    通過實例了解Nodejs模塊系統(tǒng)及require機制

    這篇文章主要介紹了通過實例了解Nodejs模塊系統(tǒng)及require機制,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-07-07
  • node.js 抓取代理ip實例代碼

    node.js 抓取代理ip實例代碼

    這篇文章主要介紹了node.js 抓取代理ip實例代碼的相關資料,需要的朋友可以參考下
    2017-04-04
  • electron demo項目npm install安裝失敗的解決方法

    electron demo項目npm install安裝失敗的解決方法

    下面小編就為大家分享一篇electron demo項目npm install安裝失敗的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-02-02
  • 解析NodeJs的調試方法

    解析NodeJs的調試方法

    本文主要介紹了NodeJs調試的步驟,以及實例方法,具有一定的參考作用,需要的朋友可以看下
    2016-12-12
  • Node在Controller層進行數(shù)據(jù)校驗的過程詳解

    Node在Controller層進行數(shù)據(jù)校驗的過程詳解

    這篇文章主要給大家介紹了關于Node在Controller層進行數(shù)據(jù)校驗的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08

最新評論