Promise/Deferred ist eine gute Spezifikation für die Handhabung der asynchronen Aufrufcodierung. Im Folgenden wird NodeJS-Code als Klasse verwendet, um eine einfache Implementierung der Promise/A-Spezifikation zu implementieren.
var EventEmitter = require('events').EventEmitter;
var http = require('http');
var util = require('util');
//Versprechungsobjekt definieren
var Promise = function(){
// Geerbte Ereignisklasse implementieren
EventEmitter.call(this);
}
//Allgemeine Ereignismethode erben
util.inherits(Promise, EventEmitter);
//Die then-Methode ist die Methode in der Promise/A-Spezifikation
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);
}
Geben Sie dies zurück;
}
//Deferred Object definieren
//Enthält einen Zustand und ein Versprechensobjekt
var Deferred = function(){
This.state = 'unerfüllt';
This.promise = new Promise();
}
Deferred.prototype.resolve = function(obj){
This.state = 'erfüllt';
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);
}
//Verwenden Sie eine http-Anfrage, um das oben definierte Versprechen/aufgeschoben anzuwenden
var client = function(){
var-Optionen = {
Hostname:'www.baidu.com',
Port:80,
Pfad:'/',
Methode: 'get'
};
var deferred = new Deferred();
var req = http.request(options, function(res){
res.setEncoding('utf-8');
var data = '';
res.on('data', function(chunk){
data = chunk;
deferred.progress(chunk);
});
res.on('end', function(){
deferred.resolve(data);
});
});
req.on('error', function(err){
deferred.reject(err);
})
req.end();
Rückgabe deferred.promise;
}
client().then(function(data){
console.log('Anfrage abgeschlossen', Daten);
}, function(err){
Console.log('Zugriffsfehler', err);
}, function(chunk){
console.log('reading', chunk);
});
Der Code wird als Promise.js gespeichert und kann über die Befehlszeile ausgeführt werden. Geben Sie direkt Node Promise.js ein, um den laufenden Effekt zu sehen.