欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

我的Node.js學(xué)習(xí)之路(三)--node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)

 更新時間:2014年07月06日 09:32:43   投稿:hebedich  
本篇文章主要介紹了node.js的幾個重要的知識點:node.js作用、回調(diào)、同步和異步代碼 以及事件循環(huán)

一,node.js的作用,

I/O的意義,(I/O是輸入/輸出的簡寫,如:鍵盤敲入文本,輸入,屏幕上看到文本顯示輸出。鼠標(biāo)移動,在屏幕上看到鼠標(biāo)的移動。終端的輸入,和看到的輸出。等等)
 
node.js想解決的問題,(處理輸入,輸入,高并發(fā) 。如 在線游戲中可能會有上百萬個游戲者,則有上百萬的輸入等等)(node.js適合的范疇:當(dāng)應(yīng)用程序需要在網(wǎng)絡(luò)上發(fā)送和接收數(shù)據(jù)時Node.js最為適合。這可能是第三方的API,聯(lián)網(wǎng)設(shè)備或者瀏覽器與服務(wù)器之間的實時通信)
 
并發(fā)的意義,(并發(fā)這個術(shù)語描述的是事情會在同時發(fā)生并可能相互交互。Node的事件化的I/O模型讓我們無需擔(dān)心互鎖和并發(fā)這兩個在多線程異步I/O中常見的問題)
 
演示網(wǎng)絡(luò)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并報告收到響應(yīng)的情況以及所耗費的時間。
我們可以看到兩次輸出的時間是不一樣的。受各種影響,解析DNS請求的時間,服務(wù)器繁忙程序等等。
 
為什么javascript是一個事件驅(qū)動的語言
javascript圍繞著最初與文檔對象模型(DOM)相關(guān)的事件架構(gòu)。開發(fā)人員可以在事件發(fā)生時做事情。這些事件有用戶點擊一個元素,頁面完成加載等。使用事件,開發(fā)人員可以編寫事件的監(jiān)聽器,當(dāng)事件發(fā)生時被觸發(fā)。
 
二,回調(diào)(Callback)
1,什么是回調(diào)
2,剖析回調(diào)
 
回調(diào)指的是將一個函數(shù)作為參數(shù)傳遞給另一個函數(shù),并且通常在第一個函數(shù)完成后被調(diào)用。
 
例子:如jquery中的hide()方法,
Js代碼 

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

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

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

1,是沒有回調(diào),,執(zhí)行順序是一樣但是,我們可以看到p段落還沒有隱藏完全,alert就出來
2,是有回調(diào)的,執(zhí)行則是hide完成后在alert
 
 剖析回調(diào)
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,coffee
Finished breakfast. Time to go to work!

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

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

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

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

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

 結(jié)果:Got response:200
1,請求http模塊,以便在腳本中使用
2,給http.get()方法提供兩個參數(shù)
3,第一個參數(shù)是選項對象。在本示例中,要求獲取shapeshed.com的主頁
4,第二個參數(shù)是一個以響應(yīng)作為參數(shù)的回調(diào)函數(shù)
5,當(dāng)遠程服務(wù)器返回相應(yīng)時,會觸發(fā)回調(diào)函數(shù)。
6,在回調(diào)函數(shù)內(nèi)記錄響應(yīng)狀態(tài)碼,如果有錯誤的話可以記錄下來。
  
 接下來,我們看看有4個不同的I/O操作都在發(fā)生,他們都使用回調(dià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"); 
}); 

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


  
 同步和異步代碼 

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

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

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

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()函數(shù)返回了,fetchApi()函數(shù)隨之立刻被調(diào)用。代碼通過使用回調(diào),是非阻塞的了。一旦調(diào)用了,兩個函數(shù)都會偵聽遠程服務(wù)器的返回,并以此觸發(fā)回調(diào)函數(shù)。
注意這些函數(shù)的返回順序是無法保證的,而是和網(wǎng)絡(luò)有關(guān)。
 
事件循環(huán)

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

Node.js經(jīng)常被當(dāng)作是一個網(wǎng)絡(luò)編程框架,因為它的設(shè)計旨在處理網(wǎng)絡(luò)中數(shù)據(jù)流的不確定性。促成這樣的設(shè)計的是事件循環(huán)和對回調(diào)的使用,他們似的程序員可以編寫對網(wǎng)絡(luò)或I/O事件進行響應(yīng)的異步代碼。

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

相關(guān)文章

  • Node.js如何提取文件中的中文字符

    Node.js如何提取文件中的中文字符

    這篇文章主要介紹了Node.js如何提取文件中的中文字符,本文介紹了在Node.js開發(fā)中如何使用代碼提取文件中的中文字符,幫助開發(fā)者更好地處理中文文本數(shù)據(jù),提高開發(fā)效率
    2023-05-05
  • Node.js的Koa框架上手及MySQL操作指南

    Node.js的Koa框架上手及MySQL操作指南

    Node世界中新興的Koa框架比Express更加輕便,且擴展對數(shù)據(jù)庫操作的支持十分強大,這里我們就來看一下Node.js的Koa框架上手及MySQL操作指南:
    2016-06-06
  • 詳解Node.js一行命令上傳本地文件到服務(wù)器

    詳解Node.js一行命令上傳本地文件到服務(wù)器

    這篇文章主要介紹了Node.js一行命令上傳本地文件到服務(wù)器,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 淺析Node.js中的內(nèi)存泄漏問題

    淺析Node.js中的內(nèi)存泄漏問題

    這篇文章主要介紹了淺析Node.js中的內(nèi)存泄漏問題,Node.js是使JavaScript應(yīng)用在服務(wù)器端運行的一款框架,需要的朋友可以參考下
    2015-06-06
  • Node中文件斷點續(xù)傳原理和方法總結(jié)

    Node中文件斷點續(xù)傳原理和方法總結(jié)

    在之前做過一個小項目,涉及到了文件上傳,在大文件上面使用了斷點續(xù)傳,降低了服務(wù)器方面的壓力,現(xiàn)在小編把Node中文件斷點續(xù)傳原理和方法總結(jié)分享給大家,感興趣的朋友一起看看吧
    2022-01-01
  • 在?node?中使用?koa-multer?庫上傳文件的方式詳解

    在?node?中使用?koa-multer?庫上傳文件的方式詳解

    本文主要介紹了上傳單個文件、多個文件,文件數(shù)量大小限制、限制文件上傳類型和對上傳的圖片進行不同大小的裁剪,對node使用?koa-multer?庫上傳文件相關(guān)知識感興趣的朋友一起看看吧
    2024-01-01
  • 解決Nodejs全局安裝模塊后找不到命令的問題

    解決Nodejs全局安裝模塊后找不到命令的問題

    今天小編就為大家分享一篇解決Nodejs全局安裝模塊后找不到命令的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05
  • 詳解nodejs 開發(fā)企業(yè)微信第三方應(yīng)用入門教程

    詳解nodejs 開發(fā)企業(yè)微信第三方應(yīng)用入門教程

    這篇文章主要介紹了詳解nodejs 開發(fā)企業(yè)微信第三方應(yīng)用入門教程,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • node.js中的fs.lchown方法使用說明

    node.js中的fs.lchown方法使用說明

    這篇文章主要介紹了node.js中的fs.lchown方法使用說明,本文介紹了fs.lchown的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下
    2014-12-12
  • Nodejs回調(diào)加超時限制兩種實現(xiàn)方法

    Nodejs回調(diào)加超時限制兩種實現(xiàn)方法

    這篇文章主要介紹了Nodejs回調(diào)加超時限制兩種實現(xiàn)方法的相關(guān)資料,需要的朋友可以參考下
    2017-06-06

最新評論