머리말
NodeJS의 가장 큰 하이라이트는 이벤트 중심의 비 블로킹 I/O 모델로, NodeJS는 동시성 처리 기능을 강력하게 만들고 네트워크 응용 프로그램 작성에 매우 적합합니다. Nodejs의 대부분의 I/O 작업은 거의 비동기식입니다. 즉, I/O 작업 결과는 기본적으로 파일의 내용을 읽는 다음 기능과 같이 콜백 함수에서 처리해야합니다.
코드 사본은 다음과 같습니다.
fs.readfile ( '/etc/passwd', function (err, data) {
(err)를 던지면;
Console.log (데이터);
});
그렇다면 두 파일을 읽고이 두 파일의 내용을 병합하면 어떻게해야합니까? JS와 접촉하지 않은 대부분의 사람들은 다음을 수행 할 수 있습니다.
코드 사본은 다음과 같습니다.
fs.readfile ( '/etc/passwd', function (err, data) {
(err)를 던지면;
fs.readfile ( '/etc/passwd2', function (err, data2) {
(err)를 던지면;
// 데이터 및 data2의 데이터를 여기에서 처리합니다
});
});
여러 유사한 시나리오를 다루는 경우 콜백 함수가 레이어별로 중첩되어 있지 않습니까? 이것은 사람들이 종종 피라미드 또는 콜백 지옥 (http://callbackhell.com/)을 다시 부르는 것입니다. 또한 JS 초보자에게는 가장 어려운 문제이기도합니다.
이러한 종류의 중첩 코드는 주로 다음에 반영된 많은 문제를 개발에 가져 왔습니다.
1. 코드의 가능성이 악화됩니다
2. 디버깅 어려움
3. 예외가 발생한 후 확인하기가 어렵습니다.
이 기사는 주로 위의 비동기 콜백 문제를 우아하게 처리하는 방법을 소개합니다.
1 차 솔루션 : 재귀 적으로 비동기 콜백을 처리합니다
재귀를 코드의 실행 제어 도구로 사용할 수 있습니다. 함수로 실행 해야하는 작업을 캡슐화하고 콜백 함수를 재귀 적으로 호출하여 코드의 실행 프로세스를 제어합니다. 더 이상 고민하지 않고 말도 안되는 것에 대해 이야기 해 봅시다. 이전 코드를 살펴 보겠습니다.
코드 사본은 다음과 같습니다.
var fs = 요구 ( 'fs');
// 처리 할 파일 목록
var files = [ 'file1', 'file2', 'file3'];
함수 parsefile () {
if (files.length == 0) {
반품;
}
var file = files.shift ();
fs.ReadFile (파일, 함수 (err, data) {
// 여기에서 파일 데이터를 처리합니다
parsefile (); // 처리 후 재귀 호출을 통해 다음 파일을 처리합니다.
});
}
// 처리 시작
parsefile ();
위의 코드는 예를 들어 배열의 파일을 예를 들어 다시 처리하여 재귀 수단을 통해 코드를 제어하는 실행 프로세스를 소개했습니다.
다음과 같은 간단한 시나리오에 적용하는 것이 좋습니다. 다음과 같은 간단한 시나리오에 적용하는 것이 좋습니다. 배열의 데이터를 차례로 데이터베이스에 저장 하여이 방법을 사용할 수 있습니다.
재귀 적으로, 일부 간단한 비동기 콜백 문제를 해결할 수 있습니다. 그러나 복잡한 비동기 콜백을 다루는 것은 여전히 무력한 것 같습니다 (예 : 여러 비동기 연산의 결과를 동기화하는 것).
화려한 포인트 : Async, Q와 같은 타사 라이브러리 사용, 비동기 콜백을 처리하겠다는 약속
중첩 된 콜백을 더 잘 처리하려면 구체적으로 비동기를 다루는 일부 타사 라이브러리를 사용하는 것을 고려할 수 있습니다. 물론 능력이 있다면 비동기 처리를위한 보조 도구를 직접 작성할 수 있습니다.
비동기 처리를 처리하는 데 가장 일반적으로 사용되는 라이브러리는 Async, Q 및 Promise입니다. npmjs.org 웹 사이트에서 판단하면 Async가 가장 인기가 있습니다. 나는 이전에 비동기를 사용했으며 실제로 매우 편리하며 다양한 비동기 처리 제어 흐름이 잘 구현됩니다.
Async를 사용하여 다음과 같이 처음에 두 파일을 동시에 읽는 코드를 처리합니다.
코드 사본은 다음과 같습니다.
var async = require ( 'async')
, fs = 요구 ( 'fs');
async.parallel ([[
함수 (콜백) {
fs.readfile ( '/etc/passwd', function (err, data) {
if (err) 콜백 (err);
콜백 (NULL, 데이터);
});
},
함수 (콜백) {
fs.readfile ( '/etc/passwd2', function (err, data2) {
if (err) 콜백 (err);
콜백 (null, data2);
});
}
],,
함수 (err, results) {
// 여기에서 데이터 및 data2의 데이터 프로세스 및 각 파일의 내용은 결과에서 얻습니다.
});
비동기 모듈을 통해 비동기 실행 프로세스가 잘 제어 될 수 있으며, 이는 계층화 된 콜백의 문제를 해결할 수도 있습니다. 코드는 이전보다 명확하지만 여전히 콜백 함수와 분리 할 수는 없습니다.
콜백 기능을 사용하지 않고 비동기식을 처리 할 수 있다면 좋을 것입니다. 다음으로 ES6의 새로운 기능을 사용 하여이 목표를 달성하는 방법에 대해 이야기 해 봅시다.
우아한 포인트 : ES6을 포용하고, 콜백 기능을 교체하고, 콜백 지옥 문제를 해결하십시오.
그건 그렇고, ECMAScript Harmony (ES6)는 JS에 많은 새로운 기능을 도입했습니다. ES6에 대해 잘 모르는 학생들은 스스로 바이두어 모습을 취할 수 있습니다.
nodejs에서 ES6의 새로운 기능을 사용하려면 v0.11.x 이상을 사용해야합니다.
이 기사에서는 콜백 기능 대신 생성기 기능을 사용합니다. 발전기에 대해 모르십니까? 여기에서 확인할 수 있습니다.
여기서 우리는 두 개의 모듈 Co와 Thunkify를 사용하며 NPM 설치 명령을 사용하여 설치합니다.
이 기사의 시작 부분에서 언급 된 문제를 예로 들어보십시오. 생성기 기능을 사용하는 예제 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var fs = 요구 사항 ( 'fs')
, co = 요구 사항 ( 'co')
, thunkify = require ( 'thunkify');
var readfile = thunkify (fs.readfile);
CO (함수 *() {
var test1 = 수율 readfile ( 'test1.txt');
var test2 = 수율 readfile ( 'test2.txt');
var test = test1.tostring () + test2.tostring ();
Console.log (테스트);
}) ();
또한 코드의 예외를 처리하는 것은 매우 간단합니다.이 방법으로 수행하십시오.
코드 사본은 다음과 같습니다.
노력하다 {
var test1 = 수율 readfile ( 'test1.txt');
} catch (e) {
// 여기에서 예외를 처리합니다
}
이런 종류의 코드가 훨씬 더 우아합니까? 동기 코드 작성과 같은 비동기 적으로 처리하는 것이 좋지 않습니까?
Nodejs 필드에서 웹 개발을위한 가장 인기있는 프레임 워크는 Express입니다. Express의 Great Master Of Express TJ의 핵심 멤버는 차세대 웹 개발 프레임 워크라고 주장하는 새로운 웹 프레임 워크 인 KOA를 이끌었습니다. KOA는 실제로 ES6 생성기의 기능을 사용하여 웹 시스템을 개발할 때 콜백 레이어로 떨어지지 않도록 도와줍니다.
요약
FIBJS 프로젝트 프로모션에서 문장을 인용 : 콜백이 적고, 더 많은 여자 - 콜백이 적고, 더 많은 여자