Promise/Difered es una buena especificación para manejar la codificación de llamadas asincrónicas. El siguiente usa el código NodeJS como clase para implementar una implementación simple de la especificación de promesa/a
La copia del código es la siguiente:
/**
* Creado con JetBrains Webstorm.
* Usuario: Xuwenmin
* Fecha: 14-4-1
* Hora: 9:54 am
* Para cambiar esta plantilla, use archivo | Configuración | Plantillas de archivo.
*/
var eventEmitter = request ('events'). EventEmitter;
var http = require ('http');
var util = require ('util');
// Definir objeto de promesa
var promise = function () {
// Implementar la clase de eventos de herencia
EventEmitter.call (esto);
}
// Método general para heredar eventos
Util.inherits (promesa, eventEmitter);
// El método es el método en la especificación de promesa/a
Promise.prototype.then = function (SuccessHandler, ErrgeHandler, ProgressHandler) {
if (typeof stritcesHandler == 'function') {
this.once ('Success', SuccessHandler);
}
if (typeof errorhandler === 'function') {
this.once ('Error', ErrorHandler);
}
if (typeOf ProgressHandler === 'function') {
this.on ('Process', ProgressHandler);
}
devolver esto;
}
// Definir objeto de retraso
// contiene un estado y un objeto de promesa
var diferido = function () {
this.state = 'no fullfelled';
this.promise = new Promise ();
}
Diferido.prototype.resolve = function (obj) {
this.state = 'Fulfilled';
this.promise.emit ('éxito', obj);
}
Diferido.prototype.reject = function (err) {
this.state = 'fallido';
this.promise.emit ('error', err);
}
Diferido.prototype.progress = function (data) {
this.promise.emit ('proceso', datos);
}
// Utilice una solicitud HTTP para usar la promesa/diferida definida anteriormente
var client = function () {
opciones var = {
HostName: 'www.baidu.com',
Puerto: 80,
camino:'/',
Método: 'Get'
};
var diferido = nuevo diferido ();
var req = http.request (opciones, function (res) {
res.setEncoding ('UTF-8');
var data = '';
res.on ('Data', Function (Chunk) {
datos += fragmento;
diferido.progress (fragmento);
});
res.on ('end', function () {
diferido.resolve (datos);
});
});
req.on ('error', function (err) {
diferido.reject (err);
})
req.end ();
regresar diferido.promise;
}
cliente (). entonces (function (data) {
console.log ('solicitud completa', datos);
}, function (err) {
console.log ('error de acceso', err);
}, función (fragmento) {
console.log ('lectura', fragmento);
});
Guarde el código como prometía.js, puede ejecutarlo debajo de la línea de comando. Ingrese Node Promise.js directamente para ver el efecto de ejecución.