Promise/deferred est une bonne spécification pour gérer le codage d'appels asynchrones. Ce qui suit utilise le code nodejs comme classe pour implémenter une implémentation simple de la spécification promise/A
.
var EventEmitter = require('events').EventEmitter;
var http = require('http');
var util = require('util');
//Définir l'objet de promesse
var Promesse = function(){
// Implémentation de la classe d'événement héritée
EventEmitter.call(this);
>
//Hériter la méthode générale de l'événement
util.inherits(Promesse, EventEmitter);
//La méthode then est la méthode de la spécification promise/A
Promise.prototype.then = function(successHandler, errorHandler, progressHandler){
Si (type de successHandler == 'function'){
This.once('success', successHandler);
>
Si (typeof errorHandler === 'function'){
This.once('erreur', errorHandler);
>
Si (type de progressHandler === 'fonction'){
This.on('process', progressHandler);
>
Renvoyez ceci ;
>
//Définir un objet différé
//Contient un état et un objet de promesse
var Différé = fonction(){
This.state = 'non réalisé';
This.promise = new Promise();
>
Deferred.prototype.resolve = function(obj){
This.state = 'réalisé';
This.promise.emit('success', obj);
>
Deferred.prototype.reject = function(err){
This.state = 'échec';
This.promise.emit('error', err);
>
Deferred.prototype.progress = fonction (données) {
This.promise.emit('processus', data);
>
//Utiliser une requête http pour appliquer la promesse/différé défini ci-dessus
var client = fonction(){
options var = {
Nom d'hôte : 'www.baidu.com',
Port :80,
chemin :'/',
Méthode : 'obtenir'
};
var différé = new Deferred();
var req = http.request(options, fonction(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('erreur', fonction(erreur){
deferred.reject(err);
})
req.end();
Retour différé.promise;
>
client().then(function(data){
console.log('Demande terminée', données);
}, fonction(erreur){
Console.log('Erreur d'accès', err);
}, fonction(morceau){
console.log('lecture', morceau);
});
Le code est enregistré sous promise.js, qui peut être exécuté sous la ligne de commande. Entrez directement le nœud promise.js pour voir l'effet d'exécution.