亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

我的Node.js學習之路(三)--node.js作用、回調、同步和異步代碼 以及事件循環

2019-11-20 14:22:28
字體:
來源:轉載
供稿:網友

一,node.js的作用,

I/O的意義,(I/O是輸入/輸出的簡寫,如:鍵盤敲入文本,輸入,屏幕上看到文本顯示輸出。鼠標移動,在屏幕上看到鼠標的移動。終端的輸入,和看到的輸出。等等)
 
node.js想解決的問題,(處理輸入,輸入,高并發 。如 在線游戲中可能會有上百萬個游戲者,則有上百萬的輸入等等)(node.js適合的范疇:當應用程序需要在網絡上發送和接收數據時Node.js最為適合。這可能是第三方的API,聯網設備或者瀏覽器與服務器之間的實時通信)
 
并發的意義,(并發這個術語描述的是事情會在同時發生并可能相互交互。Node的事件化的I/O模型讓我們無需擔心互鎖和并發這兩個在多線程異步I/O中常見的問題)
 
演示網絡I/O

Js代碼 

var http = require('http'),   urls = ['www.baidu.com','www.10jqka.com.cn','www.duokan.com']; function fetchPage(url){   var start = new Date();   http.get({host:url},function(res){     console.log("Got response from:" + url);     console.log("Request took:",new Date() - start, "ms");   }); } for(var i=0; i<urls.length; i++){   fetchPage(urls[i]); } 

命名為,node.js
我們在終端里面運行node node.js
輸出:

我們要求node.js訪問三個url并報告收到響應的情況以及所耗費的時間。
我們可以看到兩次輸出的時間是不一樣的。受各種影響,解析DNS請求的時間,服務器繁忙程序等等。
 
為什么javascript是一個事件驅動的語言
javascript圍繞著最初與文檔對象模型(DOM)相關的事件架構。開發人員可以在事件發生時做事情。這些事件有用戶點擊一個元素,頁面完成加載等。使用事件,開發人員可以編寫事件的監聽器,當事件發生時被觸發。
 
二,回調(Callback)
1,什么是回調
2,剖析回調
 
回調指的是將一個函數作為參數傳遞給另一個函數,并且通常在第一個函數完成后被調用。
 
例子:如jquery中的hide()方法,
Js代碼 

1,$("p").hide('slow'); 2,$("p").hide('slow',function(){alert("The paragraph is now hidden")}); 

回調是可選的,
1就不需要回調
2,是有回調的,當段落隱藏完成后它就會被調用,顯示一個alert提示。
 
為了可以看到帶與不帶回調的代碼之間的區別
Js代碼 

$("p").hide('slow'); alert("The paragraph is now hidden");//1  $("p").hide('slow',function(){alert("The paragraph is now hidden")});//2 

1,是沒有回調,,執行順序是一樣但是,我們可以看到p段落還沒有隱藏完全,alert就出來
2,是有回調的,執行則是hide完成后在alert
 
 剖析回調
Js代碼 

function haveBreakfast(food,drink,callback){   console.log('Having barakfast of' + food + ', '+ drink);   if(callback && typeof(callback) === "function"){     callback();   } }  haveBreakfast('foast','coffee',function(){   console.log('Finished breakfast. Time to go to work!'); }); 

 
輸出:

Having barakfast of foast,coffeeFinished breakfast. Time to go to work!

這里是創建了一個函數,有三個參數,第三個參數是callback,這個參數必須是個函數。
haveBreakfast函數將所吃的東西記錄到控制臺中然后調用作為參數傳遞給它的回調函數。
 
Node.js如何使用回調

node.js中使用filesystem模塊從磁盤上讀入文件內容的示例
 
Js代碼 

var fs = require('fs');  fs.readFile('somefile.txt','utf8',function(err,data){   if(err) throw err;   console.log(data); });

結果是:somefile.txt里面的內容。
1,fs(filesystem)模塊被請求,以便在腳本中使用
2,講文件系統上的文件路徑作為第一個參數提供給fs.readFile方法
3,第二個參數是utf8,表示文件的編碼
4,將回調函數作為第三個參數提供給fs.readFile方法
5,回調函數的第一個參數是err,用于保存在讀取文件時返回的錯誤
6,回調函數的第二參數是打他,用戶保存讀取文件所返回的數據。
7,一旦文件被讀取,回調就會被調用
8,如果err為真,那么就會拋出錯誤
9,如果err為假,那么來自文件的數據就可以使用
10,在本例中,數據會記錄到控制臺上。
 
再一個,http模塊,http模塊使得開發人員可以創建http客戶端和服務器。

Js代碼 

var http = require('http');  http.get({host:'shapeshed.com'},function(res){   console.log("Got response:" + res.statusCode); }).on('error',function(e){   console.log("Got error:" + e.message);  }); 

 結果:Got response:200
1,請求http模塊,以便在腳本中使用
2,給http.get()方法提供兩個參數
3,第一個參數是選項對象。在本示例中,要求獲取shapeshed.com的主頁
4,第二個參數是一個以響應作為參數的回調函數
5,當遠程服務器返回相應時,會觸發回調函數。
6,在回調函數內記錄響應狀態碼,如果有錯誤的話可以記錄下來。
  
 接下來,我們看看有4個不同的I/O操作都在發生,他們都使用回調

Js代碼 

var fs = require('fs'),   http = require('http');  http.get({host:'www.baidu.com'},function(res){   console.log("baidu.com"); }).on('error',function(e){   console.log("Got error:" + e.message);  });  fs.readFile('somefile.txt','utf8',function(err,data){   if(err) throw err;   console.log("somefile"); });  http.get({host:'www.duokan.com'},function(res){   console.log("duokan.com"); }).on('error',function(e){   console.log("Got error:" + e.message);  });  fs.readFile('somefile2.txt','utf8',function(err,data){   if(err) throw err;   console.log("somefile2"); }); 

 我們能知道哪個操作先返回嗎?
猜測就是從磁盤上讀取的兩個文件先返回,因為無需進入網絡,但是我們很難說哪個文件先返回,因為我們不知道文件的大小。對于兩個主頁的獲取,腳本要進入網絡,而響應時間則依賴于許多難以預測的事情,Node.js進程在還有已經注冊的回調尚未觸發之前將不會退出。回調首先解決不可預測性的方法,他也是處理并發(或者說一次做超過一件事情)的高效方法。
下面是我執行的結果


  
 同步和異步代碼 

先看代碼,同步(或者阻塞)代碼

Js代碼 

function sleep(milliseconds){   var start = new Date().getTime();   while((new Date().getTime() -start) < milliseconds){    } } function fetchPage(){   console.log('fetching page');   sleep(2000);   console.log('data returned from requesting page'); } function fetchApi(){   console.log('fetching api');   sleep(2000);   console.log('data returned from the api'); } fetchPage(); fetchApi(); 

 
當腳本運行時,fetchPage()函數會被調用,直到它返回之前,腳本的運行是被阻塞的,在fetchPage()函數返回之前,程序是不能移到fetchApi()函數中的。這稱為阻塞操作。
Node.js幾乎從不使用這種編碼風格,而是異步地調用回調。
看下下面編碼,,

Js代碼 

var http = require('http');  function fetchPage(){   console.log('fetching page');   http.get({host:'www.baidu.com',path:'/?delay=2000'},     function(res){       console.log('data returned from requesting page');     }).on('error',function(e){       console.log("There was an error" + e);     }); } function fetchApi(){   console.log('fetching api');   http.get({host:'www.baidu.com',path:'/?delay=2000'},     function(res){       console.log('data returned from requesting api');     }).on('error',function(e){       console.log("There was an error" + e);     }); } fetchPage(); fetchApi(); 

 允許這段代碼的時候,就不再等待fetchPage()函數返回了,fetchApi()函數隨之立刻被調用。代碼通過使用回調,是非阻塞的了。一旦調用了,兩個函數都會偵聽遠程服務器的返回,并以此觸發回調函數。
注意這些函數的返回順序是無法保證的,而是和網絡有關。
 
事件循環

Node.js使用javascript的事件循環來支持它所推崇的異步編程風格?;旧希录h使得系統可以將回調函數先保存起來,而后當事件在將來發生時再運行。這可以是數據庫返回數據,也可以是HTTP請求返回數據。因為回調函數的執行被推遲到事件反生之后,于是就無需停止執行,控制流可以返回到Node運行時的環境,從而讓其他事情發生。

Node.js經常被當作是一個網絡編程框架,因為它的設計旨在處理網絡中數據流的不確定性。促成這樣的設計的是事件循環和對回調的使用,他們似的程序員可以編寫對網絡或I/O事件進行響應的異步代碼。

需要遵循的規則有:函數必須快速返回,函數不得阻塞,長時間運行的操作必須移到另一個進程中。
Node.js所不適合的地方包括處理大量數據或者長時間運行計算等。Node.js旨在網絡中推送數據并瞬間完成。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产不卡一区二区在线播放| 精品av在线播放| 91伊人影院在线播放| 亚洲黄页视频免费观看| 亚洲综合精品伊人久久| 亚洲精品欧美一区二区三区| 日韩欧美国产网站| 国产午夜精品麻豆| 久久久久久久国产精品视频| 国产精品三级在线| 亚洲成av人乱码色午夜| 亚洲黄色在线观看| 日韩第一页在线| 亚洲第一av网| 亚洲欧美国产日韩中文字幕| 亚洲精品视频免费| 欧美性受xxxx白人性爽| 国产精品成人免费视频| 久久久久久国产三级电影| 亚洲精品自拍第一页| 精品国内自产拍在线观看| 亚洲成人精品久久久| 18一19gay欧美视频网站| 亚洲国产97在线精品一区| 欧美精品在线免费观看| 这里只有视频精品| 色婷婷成人综合| 亚洲国产精品大全| 久久精品国产69国产精品亚洲| 精品福利樱桃av导航| 欧美性生活大片免费观看网址| 啊v视频在线一区二区三区| 亚洲欧美成人在线| 日韩av影片在线观看| 日韩高清不卡av| 日韩美女av在线| 久久久久久久久久久人体| 久久久久久久久爱| 亚洲国产美女久久久久| 欧美性色xo影院| 亚洲国产精品国自产拍av秋霞| 欧美野外猛男的大粗鳮| 欧美性生活大片免费观看网址| 情事1991在线| 日本亚洲精品在线观看| 亚洲成人教育av| 久久久国产视频91| 中文字幕少妇一区二区三区| 91日本在线视频| 国产视频在线观看一区二区| 性欧美xxxx| 国产成人精品电影久久久| 国语自产精品视频在线看抢先版图片| 久久高清视频免费| 欧美性高跟鞋xxxxhd| 欧美激情极品视频| 91精品国产综合久久久久久蜜臀| 国产一区深夜福利| 夜夜嗨av色综合久久久综合网| 久久亚洲成人精品| 国产精品一区二区三区久久| 福利二区91精品bt7086| 日韩在线视频线视频免费网站| 欧美午夜电影在线| 亚洲一区二区久久久久久久| 欧美国产一区二区三区| 搡老女人一区二区三区视频tv| 国产日韩欧美在线播放| 亚洲男人天堂九九视频| 国产综合色香蕉精品| 欧美国产在线电影| 精品香蕉在线观看视频一| 精品久久久久久久久久久久| 全色精品综合影院| 国产主播精品在线| 狠狠做深爱婷婷久久综合一区| 在线观看精品国产视频| 97超碰国产精品女人人人爽| 日本老师69xxx| 永久免费毛片在线播放不卡| 亚洲午夜国产成人av电影男同| 久久777国产线看观看精品| 国产精品大陆在线观看| 国产精品久久久久久久久久99| 国产精品∨欧美精品v日韩精品| 国产精品大片wwwwww| 日韩在线视频二区| 日本韩国在线不卡| 成人有码视频在线播放| 久久精品国产欧美亚洲人人爽| 欧美成在线观看| 精品亚洲国产视频| 亚洲一二在线观看| 国产精品一区=区| 91免费视频网站| 88国产精品欧美一区二区三区| 欧美寡妇偷汉性猛交| 久久久亚洲天堂| **欧美日韩vr在线| 日韩欧美中文字幕在线观看| 国语自产精品视频在线看一大j8| 精品中文字幕乱| 久久视频免费在线播放| 国产有码一区二区| 欧美亚洲在线播放| yellow中文字幕久久| 欧美性xxxxxxxxx| 久久久久免费精品国产| 欧美日韩第一视频| 国产亚洲在线播放| 久久久久久久久电影| 久久久久这里只有精品| 欧美主播福利视频| 国产丝袜精品视频| 亚洲国产精品久久精品怡红院| 亚洲老司机av| 青青草国产精品一区二区| 精品国产欧美一区二区五十路| 国产成人aa精品一区在线播放| 国产91色在线| 日韩精品亚洲精品| 一区二区三区视频免费| 国产激情视频一区| 久久国产精品视频| 国产精品亚洲视频在线观看| 国产丝袜一区二区| 91最新国产视频| 亚洲中国色老太| 92版电视剧仙鹤神针在线观看| 91在线高清免费观看| 欧美亚洲国产另类| 久久夜精品香蕉| 日韩精品中文字幕在线| 国产精品久久久久久久久久久新郎| 欧美日韩成人网| 亚洲国产一区二区三区在线观看| 国产精品国产福利国产秒拍| 亚洲a在线播放| 在线视频一区二区| 欧美日韩国产91| 国产99在线|中文| 亚洲精品在线看| 国产v综合v亚洲欧美久久| 亚洲伊人第一页| 日韩的一区二区| 国产一区二区三区日韩欧美| 日韩在线中文字| 久久91精品国产91久久久| 亚洲成人激情在线| 成人在线国产精品| 亚洲精品午夜精品| 久久精品久久精品亚洲人| 亚洲已满18点击进入在线看片| 亚洲人成在线播放| 国产日韩欧美在线| 7777kkkk成人观看| 亚洲电影免费观看高清完整版在线观看| 色综合视频一区中文字幕| 最近2019年手机中文字幕| 中文字幕日韩专区| 国产精品三级美女白浆呻吟| 国产欧美一区二区三区在线看| 91九色单男在线观看| 欧美日韩国产影院|