Nodejs 비동기 callback_node.js의 우아한 처리 방법
머리말
Nodejs의 가장 큰 특징은 이벤트 중심의 비차단 I/O 모델로, Nodejs는 강력한 동시 처리 기능을 갖추고 네트워크 애플리케이션 작성에 매우 적합합니다. Nodejs의 대부분의 I/O 작업은 거의 비동기식입니다. 즉, I/O 작업의 결과는 기본적으로 파일 내용을 읽는 다음 함수와 같은 콜백 함수에서 처리되어야 합니다.
fs.readFile('/etc/passwd', 함수(err, 데이터) {
if (err) throw err;
console.log(데이터);
});
그렇다면 두 개의 파일을 읽고 두 파일의 내용을 병합하여 처리한다면 어떻게 해야 할까요? 잠시 js에 노출된 대부분의 사람들은 다음과 같이 할 것입니다.
fs.readFile('/etc/passwd', 함수(err, 데이터) {
if (err) throw err;
fs.readFile('/etc/passwd2', function (err, data2) {
(err) throw err;
// 여기서 data와 data2의 데이터를 처리합니다
});
});
여러 유사한 시나리오를 다룬다면 콜백 함수가 레이어별로 중첩되어 있는 것이 아닐까요? 이를 흔히 콜백 피라미드 또는 콜백 지옥이라고 부릅니다(http://callbackhell.com/). ) 역시 JS 초보자들에게 가장 골치 아픈 문제입니다.
이러한 중첩 코드는 개발에 많은 문제를 가져오며 주로 다음과 같습니다.
1. 코드 가능성이 악화됩니다
2. 디버깅의 어려움
3. 이상 발생시 조치가 어렵다
이 글에서는 위의 비동기 콜백 문제를 적절하게 처리하는 방법을 주로 소개합니다.
기본 솔루션: 비동기 콜백을 재귀적으로 처리
재귀를 코드의 실행 제어 도구로 사용할 수 있습니다. 수행해야 하는 작업을 함수로 캡슐화하고 콜백 함수의 재귀 호출을 통해 코드의 실행 프로세스를 제어합니다. 더 이상 고민하지 말고 마지막 코드로 이동해 보겠습니다.
var fs = require('fs');
// 처리할 파일 목록
var 파일 = ['file1', 'file2', 'file3'];
함수 파싱 파일() {
if (files.length == 0) {
반품;
}
var 파일 = files.shift();
fs.readFile(파일, 함수(err, 데이터) {
// 파일 데이터가 여기서 처리됩니다
ParseFile(); // 처리 후 재귀 호출을 통해 다음 파일을 처리합니다
});
}
//처리 시작
파싱파일();
위 코드는 배열의 파일을 순차적으로 처리하는 예시로 코드의 실행 흐름을 제어하는 재귀적 방법을 도입했습니다.
예를 들어, 이 방법을 사용하면 배열의 데이터를 데이터베이스에 순차적으로 저장할 수 있습니다.
몇 가지 간단한 비동기 콜백 문제는 재귀를 통해 해결할 수 있습니다. 그러나 복잡한 비동기 콜백(예: 여러 비동기 작업의 결과를 동기화해야 하는 필요성)을 처리하는 데 여전히 다소 능력이 없습니다.
멋진 점: Async, Q, Promise와 같은 타사 라이브러리를 사용하여 비동기 콜백 처리
중첩된 콜백 문제를 더 잘 처리하기 위해 비동기 처리를 전문으로 하는 일부 타사 라이브러리를 사용하는 것을 고려할 수 있습니다. 물론, 능력이 있다면 비동기 처리를 위한 자체 보조 도구를 작성할 수도 있습니다.
비동기 처리를 처리하기 위해 더 일반적으로 사용되는 라이브러리는 async, q 및 promise입니다. npmjs.org 웹사이트에 따르면 async가 가장 인기가 높습니다. 이전에 async를 사용해 본 적이 있는데, 정말 편리합니다. 다양한 비동기 처리의 제어 흐름도 매우 잘 구현되어 있습니다.
두 개의 파일을 동시에 읽는 초기 코드를 비동기식으로 처리해 보겠습니다.
var async = require('async')
, fs = require('fs');
async.parallel([
함수(콜백){
fs.readFile('/etc/passwd', 함수(err, 데이터) {
If (err) 콜백(err);
콜백(null, 데이터);
});
},
함수(콜백){
fs.readFile('/etc/passwd2', function (err, data2) {
If (err) 콜백(err);
콜백(null, data2);
});
}
],
함수(오류, 결과){
// data와 data2의 데이터가 여기서 처리되며, 결과에서 각 파일의 내용을 가져옵니다
});
비동기 모듈을 통해 비동기 실행 프로세스를 잘 제어할 수 있으며, 이는 모든 수준에서 콜백 문제를 해결한 것으로 볼 수도 있습니다. 코드는 이전보다 명확하지만 여전히 콜백 함수와 분리될 수 없습니다.
생각해보세요. 콜백 함수를 사용하지 않고 비동기 처리를 처리할 수 있다면 좋지 않을까요? 다음으로 이 목표를 달성하기 위해 ES6의 새로운 기능을 사용하는 방법에 대해 이야기해 보겠습니다.
우아하게: ES6를 수용하고, 콜백 기능을 교체하고, 콜백 지옥 문제를 해결하세요
EcmaScript Harmony(ES6)가 js에 많은 새로운 기능을 도입했다고 합니다. ES6에 대해 잘 모르는 학생들도 Baidu에서 확인할 수 있습니다.
nodejs에서 ES6의 새로운 기능을 사용하려면 v0.11.x 버전 이상을 사용해야 합니다.
이 글에서는 콜백 함수를 대체하기 위해 Generator 기능을 사용하는 방법을 소개합니다. 여기서 살펴볼 수 있습니다.
여기에서는 co와 thunkify라는 두 개의 모듈이 사용됩니다. npm install 명령을 사용하여 설치할 수 있습니다.
이 글의 시작 부분에 언급된 문제를 예로 들어보겠습니다. 생성기 기능을 사용하는 예제 코드는 다음과 같습니다.
var fs = require('fs')
, co = 요구('co')
, thunkify = require('thunkify');
var readFile = thunkify(fs.readFile);
co(함수 *() {
var test1 = readFile('test1.txt');
var test2 = readFile('test2.txt');
var 테스트 = test1.toString() test2.toString();
console.log(테스트);
})();
코드에서 예외를 처리하는 것도 매우 간단합니다. 다음과 같이 하세요.
시도해보세요 {
var test1 = readFile('test1.txt');
} 잡기 (e) {
// 여기서 예외를 처리합니다
}
이 코드가 훨씬 우아하지 않나요? 동기 코드를 작성하는 것처럼 비동기 코드를 처리하는 것도 좋지 않나요?
nodejs 분야의 웹 개발에 있어서 가장 인기 있는 프레임워크는 express입니다. Express의 핵심 멤버인 TJ가 차세대 웹이라 불리는 새로운 웹 프레임워크인 Koa를 주도했다는 점은 언급할 가치가 있습니다. 개발 프레임워크인 koa는 ES6의 생성기 기능을 실제로 활용하여 웹 시스템을 개발할 때 콜백 계층에 빠지는 것을 방지합니다.
요약
fibjs 프로젝트 프로모션의 한 문장 인용: 콜백이 적고 소녀가 많음 - 콜백이 적고 소녀가 많음

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











Node.js는 서버측 JavaScript 런타임인 반면, Vue.js는 대화형 사용자 인터페이스를 생성하기 위한 클라이언트측 JavaScript 프레임워크입니다. Node.js는 백엔드 서비스 API 개발, 데이터 처리 등 서버 측 개발에 사용되고, Vue.js는 단일 페이지 애플리케이션, 반응형 사용자 인터페이스 등 클라이언트 측 개발에 사용됩니다.

Node.js는 고성능, 확장성, 크로스 플랫폼 지원, 풍부한 생태계, 개발 용이성 등의 기능을 제공하므로 백엔드 프레임워크로 사용할 수 있습니다.

MySQL 데이터베이스에 연결하려면 다음 단계를 따라야 합니다. mysql2 드라이버를 설치합니다. mysql2.createConnection()을 사용하여 호스트 주소, 포트, 사용자 이름, 비밀번호 및 데이터베이스 이름이 포함된 연결 개체를 만듭니다. 쿼리를 수행하려면 Connection.query()를 사용하세요. 마지막으로 Connection.end()를 사용하여 연결을 종료합니다.

Node.js에는 다음과 같은 전역 변수가 존재합니다. 전역 개체: 전역 핵심 모듈: 프로세스, 콘솔, 필수 런타임 환경 변수: __dirname, __filename, __line, __column 상수: undefine, null, NaN, Infinity, -Infinity

Node.js 설치 디렉터리에는 npm과 npm.cmd라는 두 가지 npm 관련 파일이 있습니다. 차이점은 다음과 같습니다. 확장자가 다릅니다. npm은 실행 파일이고 npm.cmd는 명령 창 바로 가기입니다. Windows 사용자: npm.cmd는 명령 프롬프트에서 사용할 수 있으며, npm은 명령줄에서만 실행할 수 있습니다. 호환성: npm.cmd는 Windows 시스템에만 해당되며 npm은 크로스 플랫폼에서 사용할 수 있습니다. 사용 권장사항: Windows 사용자는 npm.cmd를 사용하고, 기타 운영 체제는 npm을 사용합니다.

Node.js와 Java의 주요 차이점은 디자인과 기능입니다. 이벤트 중심 대 스레드 중심: Node.js는 이벤트 중심이고 Java는 스레드 중심입니다. 단일 스레드 대 다중 스레드: Node.js는 단일 스레드 이벤트 루프를 사용하고 Java는 다중 스레드 아키텍처를 사용합니다. 런타임 환경: Node.js는 V8 JavaScript 엔진에서 실행되는 반면 Java는 JVM에서 실행됩니다. 구문: Node.js는 JavaScript 구문을 사용하고 Java는 Java 구문을 사용합니다. 목적: Node.js는 I/O 집약적인 작업에 적합한 반면, Java는 대규모 엔터프라이즈 애플리케이션에 적합합니다.

예, Node.js는 백엔드 개발 언어입니다. 서버 측 비즈니스 로직 처리, 데이터베이스 연결 관리, API 제공 등 백엔드 개발에 사용됩니다.

Node.js 프로젝트의 서버 배포 단계: 배포 환경 준비: 서버 액세스 권한 획득, Node.js 설치, Git 저장소 설정. 애플리케이션 빌드: npm run build를 사용하여 배포 가능한 코드와 종속성을 생성합니다. Git 또는 파일 전송 프로토콜을 통해 서버에 코드를 업로드합니다. 종속성 설치: SSH를 서버에 연결하고 npm install을 사용하여 애플리케이션 종속성을 설치합니다. 애플리케이션 시작: node index.js와 같은 명령을 사용하여 애플리케이션을 시작하거나 pm2와 같은 프로세스 관리자를 사용합니다. 역방향 프록시 구성(선택 사항): Nginx 또는 Apache와 같은 역방향 프록시를 사용하여 트래픽을 애플리케이션으로 라우팅합니다.
