Promise/deferred는 비동기 호출 코딩을 처리하기 위한 좋은 사양입니다. 다음은 nodejs 코드를 클래스로 사용하여 promise/A 사양의 간단한 구현을 구현합니다.
var EventEmitter = require('events').EventEmitter;
var http = require('http');
var util = require('util');
//Promise 객체 정의
var 약속 = 함수(){
// 상속된 이벤트 클래스 구현
EventEmitter.call(this);
}
//이벤트 일반 메서드 상속
util.inherits(Promise, EventEmitter);
//then 메소드는 promise/A 사양의 메소드입니다
Promise.prototype.then = 함수(successHandler, errorHandler, ProgressHandler){
If (성공 핸들러 유형 == '함수'){
This.once('성공', SuccessHandler);
}
If (errorHandler 유형 === '함수'){
This.once('error', errorHandler);
}
If (progressHandler 유형 === '함수'){
This.on('process', ProgressHandler);
}
이것을 돌려주세요;
}
//지연 객체 정의
//상태와 약속 객체를 포함합니다
var 지연 = 함수(){
This.state = '미완료';
This.promise = new Promise();
}
Deferred.prototype.resolve = 함수(obj){
This.state = '완료';
This.promise.emit('success', obj);
}
Deferred.prototype.reject = 함수(err){
This.state = '실패';
This.promise.emit('error', err);
}
Deferred.prototype.progress = 함수(데이터){
This.promise.emit('process', data);
}
//http 요청을 사용하여 위에 정의된 promise/deferred를 적용합니다
var 클라이언트 = 함수(){
var 옵션 = {
호스트 이름:'www.baidu.com',
포트:80,
경로:'/',
메소드: 'get'
};
var deferred = new Deferred();
var req = http.request(옵션, 함수(res){
res.setEncoding('utf-8');
var 데이터 = '';
res.on('데이터', 함수(청크){
데이터 = 청크;
deferred.progress(청크);
});
res.on('end', function(){
deferred.resolve(data);
});
});
req.on('error', function(err){
deferred.reject(err);
})
req.end();
deferred.promise 반환;
}
클라이언트().then(함수(데이터){
console.log('요청 완료', data);
}, 함수(err){
Console.log('액세스 오류', err);
}, 함수(청크){
console.log('읽기', 덩어리);
});
코드는 promise.js로 저장되며, 명령줄에서 실행할 수 있습니다. node promise.js를 직접 입력하면 실행 효과를 확인할 수 있습니다.