Promise/Deferred는 비동기 통화 인코딩을 처리하기위한 좋은 사양입니다. 다음은 Nodejs 코드를 클래스로 사용하여 간단한 약속/사양을 구현합니다.
코드 사본은 다음과 같습니다.
/**
* JetBrains Webstorm으로 만들어졌습니다.
* 사용자 : Xuwenmin
* 날짜 : 14-4-1
* 시간 : 오전 9시 54 분
*이 템플릿을 변경하려면 파일 사용 | 설정 | 파일 템플릿.
*/
var eventimitter = require ( 'events'). Eventemitter;
var http = 요구 ( 'http');
var util = 요구 ( 'util');
// 약속 객체를 정의합니다
var promise = function () {
// 상속 이벤트 클래스를 구현합니다
이벤트 미터 .call (this);
}
// 이벤트를 상속하는 일반적인 방법
util.inherits (약속, 이벤트 미터);
// 그러면 메소드는 약속/사양의 메소드입니다.
promise.prototype.then = function (successHandler, ErrorHandler, ProgressHandler) {
if (successof yessionhandler == 'function') {
this.once ( 'success', successhandler);
}
if (typeof ErrorHandler === 'function') {
this.once ( 'error', ErrorHandler);
}
if (typeof progressHandler === 'function') {
this.on ( '프로세스', ProgressHandler);
}
이것을 반환하십시오;
}
// 지연 객체를 정의합니다
// 상태와 약속 대상이 포함되어 있습니다
var deferred = function () {
this.state = 'Unfulfilled';
this.promise = new Promise ();
}
Deferred.prototype.resolve = function (obj) {
this.state = '충족';
this.promise.emit ( 'success', obj);
}
Deferred.prototype.reject = function (err) {
this.state = '실패';
this.promise.emit ( 'error', err);
}
Deferred.prototype.progress = function (data) {
this.promise.emit ( '프로세스', 데이터);
}
// http 요청을 사용하여 위에서 정의 된 약속/연기를 사용합니다.
var client = function () {
var 옵션 = {
호스트 이름 : 'www.baidu.com',
포트 : 80,
길:'/',
방법 : '얻기'
};
var Deferred = New Deferred ();
var req = http.request (옵션, 함수 (res) {
res.setencoding ( 'utf-8');
var data = '';
res.on ( 'data', function (chunk) {
데이터 += 청크;
Deferred.progress (청크);
});
res.on ( 'end', function () {
Deferred.resolve (데이터);
});
});
req.on ( 'error', function (err) {
연기. 반환 (err);
})
req.end ();
Return Deferred.Promise;
}
client (). 그런 다음 (함수 (data) {
Console.log ( '요청 완료', 데이터);
}, function (err) {
Console.log ( 'Access Error', err);
}, function (청크) {
Console.log ( 'Reading', Chunk);
});
CODE를 Promise.js로 저장하면 명령 줄 아래에서 실행할 수 있습니다. 실행 효과를 확인하려면 Node Promise.js를 직접 입력하십시오.