Promise/deferred は、非同期呼び出しコーディングを処理するための優れた仕様です。以下では、nodejs コードをクラスとして使用して、promise/A 仕様の単純な実装を実装します。
var EventEmitter = require('events').EventEmitter;
var http = require('http');
var util = require('util');
//Promise オブジェクトを定義します
var Promise = function(){
// 継承したイベントクラスを実装します
EventEmitter.call(this);
}
//イベント一般メソッドを継承
util.inherits(Promise, EventEmitter);
// then メソッドは、promise/A 仕様のメソッドです
Promise.prototype.then = function(successHandler, errorHandler, progressHandler){
If (typeof successHandler == '関数'){
This.once('success', successHandler);
}
If (errorHandler のタイプ === '関数'){
This.once('error', errorHandler);
}
If (progressHandler のタイプ === '関数'){
This.on('プロセス', progressHandler);
}
これを返してください;
}
//遅延オブジェクトを定義
//状態とプロミスオブジェクトが含まれます
var Deferred = function(){
This.state = '未履行';
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 リクエストを使用して、上で定義した Promise/deferred を適用します
var client = function(){
var オプション = {
ホスト名:'www.baidu.com',
ポート:80、
パス:'/',
メソッド: 'get'
};
var deferred = new Deferred();
var req = http.request(オプション, 関数(res){
res.setEncoding('utf-8');
var data = '';
res.on('data', function(chunk){
データ = チャンク;
deferred.progress(chunk);
});
res.on('end', function(){
deferred.resolve(data);
});
});
req.on('エラー', function(err){
deferred.reject(err);
})
req.end();
deferred.promise を返します;
}
client().then(function(data){
console.log('リクエストが完了しました', データ);
}、関数(エラー){
Console.log('アクセスエラー', err);
}、関数(チャンク){
console.log('読み取り', チャンク);
});
コードはpromise.jsとして保存され、コマンドラインでノードpromise.jsを直接入力して実行結果を確認できます。