>  기사  >  웹 프론트엔드  >  나의 Node.js 학습 경로(3) - node.js 함수, 콜백, 동기 및 비동기 코드, 이벤트 loop_node.js

나의 Node.js 학습 경로(3) - node.js 함수, 콜백, 동기 및 비동기 코드, 이벤트 loop_node.js

WBOY
WBOY원래의
2016-05-16 16:42:352011검색

1. node.js의 역할,

I/O의 의미, (I/O는 input/output의 약자로 키보드로 텍스트를 입력하다, 입력하다, 화면에 출력되는 텍스트를 본다. 마우스를 움직여 움직임을 본다. 화면에서 마우스의 입력, 출력 등)

node.js가 해결하려는 문제는 (입력 처리, 입력, 높은 동시성. 예를 들어 온라인 게임에는 수백만 명의 플레이어가 있을 수 있고 수백만 개의 입력이 있을 수 있다는 등)입니다. 적합한 경우: 애플리케이션이 네트워크를 통해 데이터를 보내고 받아야 하는 경우 Node.js가 가장 적합합니다. 이는 타사 API, 네트워크 장치 또는 브라우저와 서버 간의 실시간 통신일 수 있습니다. 🎜>
동시성의 의미(동시성이라는 용어는 동시에 발생하고 서로 상호 작용할 수 있는 일을 나타냅니다. 노드의 이벤트 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(문서 개체 모델)과 관련된 이벤트를 중심으로 설계되었습니다. 개발자는 이벤트가 발생할 때 작업을 수행할 수 있습니다. 이러한 이벤트에는 사용자가 요소를 클릭하는 것, 페이지 로딩을 완료하는 것 등이 포함됩니다. 이벤트를 사용하여 개발자는 이벤트가 발생할 때 트리거되는 이벤트 리스너를 작성할 수 있습니다.

2. 콜백
1. 콜백이란
2. 콜백 분석

콜백은 함수를 다른 함수에 인수로 전달하는 것을 의미하며 일반적으로 첫 번째 함수가 완료된 후에 호출됩니다.

예: jquery의 hide() 메소드,
JS 코드

1,$("p").hide('slow'); 
2,$("p").hide('slow',function(){alert("The paragraph is now hidden")}); 
콜백은 선택 사항입니다.

1 콜백 필요 없음
2. 콜백이 있으면 단락이 숨겨지면 호출되고 경고 메시지가 표시됩니다.

따라서 콜백이 있는 코드와 없는 코드의 차이점을 확인할 수 있습니다
JS 코드

$("p").hide('slow'); 
alert("The paragraph is now hidden");//1 
 
$("p").hide('slow',function(){alert("The paragraph is now hidden")});//2 
1, 콜백이 없고, 실행 순서도 동일하지만, p 문단이 완전히 숨겨지지 않고 경고가 나오는 것을 볼 수 있습니다

2. 콜백이 있고, 숨김이 완료된 후 실행이 경고
됩니다.
콜백 분석
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!
다음은 세 개의 매개변수로 생성된 함수입니다. 세 번째 매개변수는 콜백입니다.

haveBreakfast 함수는 무엇을 먹었는지 콘솔에 기록한 다음 매개변수로 전달된 콜백 함수를 호출합니다.

Node.js에서 콜백을 사용하는 방법

파일 시스템 모듈을 사용하여 node.js의 디스크에서 파일 내용을 읽는 예


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이 true이면 오류가 발생합니다
9. err이 false이면 파일의 데이터를 사용할 수 있습니다
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); 
 
}); 
결과: 응답 수: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:'/&#63;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:'/&#63;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的事件循环来支持它所推崇的异步编程风格。基本上,事件循环使得系统可以将回调函数先保存起来,而后当事件在将来发生时再运行。这可以是数据库返回数据,也可以是HTTP请求返回数据。因为回调函数的执行被推迟到事件反生之后,于是就无需停止执行,控制流可以返回到Node运行时的环境,从而让其他事情发生。

Node.js经常被当作是一个网络编程框架,因为它的设计旨在处理网络中数据流的不确定性。促成这样的设计的是事件循环和对回调的使用,他们似的程序员可以编写对网络或I/O事件进行响应的异步代码。

需要遵循的规则有:函数必须快速返回,函数不得阻塞,长时间运行的操作必须移到另一个进程中。
Node.js所不适合的地方包括处理大量数据或者长时间运行计算等。Node.js旨在网络中推送数据并瞬间完成。

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.