비즈니스 시나리오를 가정합니다.
RSS 주소를 통해 RSS를 가져 와서 파일에 저장하면 RSS 주소가 파일에 저장됩니다.
이 시나리오에서 비즈니스를 완료하려면 세 가지 작업이 필요합니다.
1. 파일에서 RSS 주소를 읽으십시오.
2. RSS를 얻으십시오.
3. 파일을 저장하십시오.
마지막 으로이 세 가지 작업은 통합되었습니다.
준비하다:
RSS 주소를 저장하는 파일, address.txt.
http://programmer.csdn.net/rss_programmer.html
Task 1:
RSS 주소 파일의 내용을 읽고 콜백을 통해 반환하십시오.
코드 사본은 다음과 같습니다.
var getrssaddress = 함수 (경로, 콜백) {
fs.ReadFile (path, {인코딩 : 'utf8'}, function (err, data) {
콜백 (err, data);
});
}
Task 2:
RSS 주소를 통해 RSS로 이동하고 콜백을 통해 오류 또는 데이터를 반환하십시오.
코드 사본은 다음과 같습니다.
var getrss = function (url, 콜백) {
var data = '';
http.get (url, function (res) {
res.on ( 'data', function (Chrunk) {
Data += Chrunk;
});
res.on ( 'end', function () {
콜백 (NULL, 데이터);
});
}). on ( 'error', function (err) {
콜백 (err, null);
});
}
작업 3 : : 작업 3 :
파일에 RSS를 저장하고 콜백을 통해 오류를 반환합니다.
코드 사본은 다음과 같습니다.
var saverss = function (data, 콜백) {
fs.writefile ( 'rss.txt', data, 'utf8', function (err) {
콜백 (err);
});
}
완성:
코드 사본은 다음과 같습니다.
getrssaddress ( 'address.txt', function (err, data) {
if (err) {
Console.log (err);
반품;
}
getrss (data, function (err, data) {
if (err) {
Console.log (err);
반품;
}
Saverss (데이터, 함수 (err) {
if (err) console.log (err);
});
});
});
위의 코드는 완전히 비동기 처리입니다. 가장 일반적인 콜백은 비동기 논리의 반환을 처리하는 데 사용됩니다. 장점은 표준 쓰기 방법이 모든 사람이 받아들이 기 쉽다는 것입니다. 단점은 커플 링이 너무 강해서 예외의 처리는 코드가 직관적이지 않다는 것입니다. 특히 복잡한 비즈니스 논리 및 많은 작업을 처리 할 때 계층화 된 콜백은 사람들이 그들을보고 유지하기가 어렵다는 것입니다.
약속/사양의 구현 중 하나는 그러한 문제 도메인을 목표로하는 날입니다.
수정 된 코드를 살펴 보겠습니다.
Task 1:
코드 사본은 다음과 같습니다.
var getrssaddress = function (path) {
var deferred = when.defer ();
fs.ReadFile (path, {인코딩 : 'utf8'}, function (err, data) {
(err)이 연기 된 경우 (err);
Deferred.resolve (데이터);
});
Return Deferred.Promise;
}
Task 2:
코드 사본은 다음과 같습니다.
var getrss = function (url) {
var deferred = when.defer ();
var data = '';
http.get (url, function (res) {
res.on ( 'data', function (Chrunk) {
Data += Chrunk;
});
res.on ( 'end', function () {
Deferred.resolve (데이터);
});
}). on ( 'error', function (err) {
연기. 반환 (err);
});
Return Deferred.Promise;
}
작업 3 : : 작업 3 :
코드 사본은 다음과 같습니다.
var saverss = function (data) {
var deferred = when.defer ();
fs.writefile ( 'rss.txt', data, 'utf8', function (err) {
(err)이 연기 된 경우 (err);
Deferred.resolve ();
});
Return Deferred.Promise;
}
완성:
코드 사본은 다음과 같습니다.
getrssaddress ( 'address.txt')
. 그런데 (getrss)
. 그런 다음 (세이버)
.catch (function (err) {
Console.log (err);
});
설명하다:
Promise/A 사양에 의해 정의 된 "연기/약속"모델은 "게시/가입자"모델입니다. 연기 된 객체를 통한 이벤트 게시는 완료 해결 이벤트 또는 실패한 거부 이벤트 일 수 있습니다. 해당 완료 또는 실패한 구독은 약속 객체를 통해 이루어집니다.
약속/사양에서 각 작업에는 기본값 (보류), 이행 (이행) 및 실패 (거부)의 세 가지 상태가 있습니다.
1. 기본 상태는 한 방향으로 완료 상태로 전송 될 수 있습니다. 이 프로세스는 Resolve라고하며 해당 방법은 지연됩니다. Resolve (PromisorValue);
2. 기본 상태는 한 방향으로 실패한 상태로 전송 될 수 있습니다. 이 과정은 거부라고하며 해당 방법을 연기합니다. Reject (이유);
3. 기본 상태에서는 Deferred.notify (Update)를 통해 작업 실행 정보를 선언 할 수도 있습니다.
4. 주 양도는 일회성입니다. 작업이 초기 보류에서 다른 상태로 변경되면 다음 작업의 실행 프로세스에 들어갑니다.
위의 코드를 따르십시오.
날짜를 통해 지연된 물체를 정의하십시오.
var deferred = when.defer ();
비동기 데이터가 성공적으로 얻어지면 완료 이벤트가 게시됩니다.
Deferred.resolve (데이터);
비동기 데이터 수집이 실패한 후 실패한 이벤트가 게시됩니다.
연기. 반환 (err);
약속 개체를 구독으로 반환하십시오.
Return Deferred.Promise;
구독은 당시 약속 객체의 방법을 통해 완료/실패/알림을받은 구독입니다.
getrssaddress ( 'address.txt')
. 그런데 (getrss)
그런 다음 세 가지 매개 변수, 즉 성취, 재판매 및 OnProgress가 있습니다.
약속.
이전 작업은 Resolve (데이터)이며, 완료 된 기능이 트리거되고 데이터가 매개 변수로 사용됩니다.
이전 과제가 거부되면 (이유), oneverfed가 트리거되고 이유가 접수됩니다.
언제라도, 성취되고 재판매 중 하나만 트리거 될 수 있으며 한 번만 트리거 될 수 있습니다.
예외를 처리하기 위해 JS는 매우 편리한 방법을 제공합니다. 그런 다음 오류를 전달할 수 있습니다. 여러 작업이 연속적으로 실행되면 마지막에 반사 된 것만 정의 할 수 있습니다. 마지막 후에 캐치 함수를 호출 한 다음 작업 예외를 포착 할 수도 있습니다.
이것은 그것을 쓰는 간단하고 명확한 방법입니다.
코드 사본은 다음과 같습니다.
getrssaddress ( 'address.txt')
. 그런데 (getrss)
. 그런 다음 (세이버)
.catch (function (err) {
Console.log (err);
});
Promise는 비동기식 프로그래밍에 큰 편의를 제공하여 피라미드 불행에 빠지지 않고 단일 작업의 구현에 집중할 수 있습니다. 위의 코드는 기본적인 사용 일뿐입니다. 이 기사에서 언급 한 기능보다 훨씬 더 많은 것을 제공 할 때, 자세한 내용은 공식 API를 참조하십시오.