Promise/Deferredは、非同期コールエンコーディングを処理するための優れた仕様です。以下は、nodejsコードをクラスとして使用して、約束/仕様の簡単な実装を実装する
コードコピーは次のとおりです。
/**
* JetBrains WebStormで作成されました。
*ユーザー:Xuwenmin
*日付:14-4-1
*時間:午前9時54分
*このテンプレートを変更するには、ファイルを使用します|設定|ファイルテンプレート。
*/
var eventemitter = require( 'events')。eventemitter;
var http = require( 'http');
var util = require( 'util');
// Promise Objectを定義します
var promise = function(){
//継承イベントクラスを実装します
eventemitter.call(this);
}
//イベントを継承する一般的な方法
util.inherits(promise、eventemitter);
//メソッドは約束のメソッド/a仕様です
promise.prototype.then = function(successhandler、errorhandler、progresshandler){
if(typeof successhandler == 'function'){
this.once( 'success'、successhandler);
}
if(typeof errorhandler === 'function'){
this.once( 'error'、errorhandler);
}
if(typeof progresshandler === 'function'){
this.on( 'Process'、ProgressHandler);
}
これを返します。
}
//遅延オブジェクトを定義します
//状態と約束のオブジェクトが含まれています
var deferred = function(){
this.state = 'unfulfilled';
this.promise = new Promise();
}
deferred.prototype.resolve = function(obj){
this.state = 'fulfilled';
this.promise.emit( 'success'、obj);
}
deferred.prototype.reject = function(err){
this.state = 'failed';
this.promise.emit( 'error'、err);
}
deferred.prototype.progress = function(data){
this.promise.emit( 'process'、data);
}
// httpリクエストを使用して上記で定義されたPromise/Deferredを使用する
var client = function(){
var options = {
ホスト名: 'www.baidu.com'、
ポート:80、
パス:'/'、
方法:「取得」
};
var deferred = new Deferred();
var req = http.request(options、function(res){
Res.SetEncoding( 'UTF-8');
var data = '';
res.on( 'data'、function(chunk){
データ += chunk;
deferred.progress(chunk);
});
res.on( 'end'、function(){
deferred.resolve(data);
});
});
req.on( 'error'、function(err){
deferred.reject(err);
})
req.end();
deferred.promiseを返します。
}
client()。then(function(data){
console.log( 'request Completed'、data);
}、function(err){
console.log( 'アクセスエラー'、err);
}、function(chunk){
console.log( 'reading'、chunk);
});
コードをpromise.jsとして保存すると、コマンドラインの下で実行できます。 Node Promise.jsを直接入力して、実行中の効果を確認します。