Supposons un scénario commercial:
Grâce à l'adresse RSS, obtenez le RSS et enregistrez-le dans le fichier, et l'adresse RSS est enregistrée dans le fichier.
Pour terminer l'entreprise dans ce scénario, trois tâches sont nécessaires:
1. Lisez l'adresse RSS du fichier.
2. Obtenez RSS.
3. Enregistrer dans le fichier.
Enfin, ces trois tâches sont intégrées.
Préparer:
Fichiers qui stockent l'adresse RSS, adresse.txt.
http://programmer.csdn.net/rss_programmer.html
Tâche 1:
Lisez le contenu du fichier d'adresse RSS et retournez via le rappel.
La copie de code est la suivante:
var getrssaddress = fonction (chemin, rappel) {
fs.readfile (path, {Encoding: 'utf8'}, fonction (err, data) {
rappel (err, données);
});
}
Tâche 2:
Accédez à RSS via l'adresse RSS et renvoyez l'erreur ou les données via le rappel.
La copie de code est la suivante:
var getrss = fonction (url, rappel) {
var data = '';
http.get (url, fonction (res) {
res.on ('data', fonction (chrunk) {
data + = chrunk;
});
res.on ('end', function () {
rappel (null, données);
});
}). sur ('error', fonction (err) {
rappel (err, null);
});
}
Tâche 3:
Enregistrez RSS dans un fichier et renvoyez une erreur via le rappel.
La copie de code est la suivante:
var Saverss = fonction (données, rappel) {
fs.writeFile ('rss.txt', data, 'utf8', fonction (err) {
rappel (err);
});
}
Intégration:
La copie de code est la suivante:
getrssaddress ('adresse.txt', fonction (err, data) {
if (err) {
console.log (err);
retour;
}
getrss (données, fonction (err, données) {
if (err) {
console.log (err);
retour;
}
Saverss (données, fonction (err) {
if (err) console.log (err);
});
});
});
Le code ci-dessus est entièrement un traitement asynchrone. Le rappel le plus courant est utilisé pour gérer le retour de la logique asynchrone. L'avantage est que la méthode d'écriture standard est facile à accepter pour tout le monde; L'inconvénient est que le couplage est trop fort, le traitement des exceptions est que le code n'est pas intuitif, surtout lorsqu'il s'agit d'une logique commerciale complexe et de nombreuses tâches, les rappels en couches feront les regarder et le code est difficile à entretenir.
L'une des implémentations de la promesse / une spécification est quand.js, qui vise un tel domaine de problème.
Jetons un coup d'œil au code modifié.
Tâche 1:
La copie de code est la suivante:
var getrssaddress = function (path) {
var différé = quand.defer ();
fs.readfile (path, {Encoding: 'utf8'}, fonction (err, data) {
if (err) Deferred.Reject (err);
Deferred.resolve (données);
});
retour différé.promes;
}
Tâche 2:
La copie de code est la suivante:
var getrss = fonction (url) {
var différé = quand.defer ();
var data = '';
http.get (url, fonction (res) {
res.on ('data', fonction (chrunk) {
data + = chrunk;
});
res.on ('end', function () {
Deferred.resolve (données);
});
}). sur ('error', fonction (err) {
Deferred.Reject (ERR);
});
retour différé.promes;
}
Tâche 3:
La copie de code est la suivante:
var Saverss = fonction (data) {
var différé = quand.defer ();
fs.writeFile ('rss.txt', data, 'utf8', fonction (err) {
if (err) Deferred.Reject (err);
Deferred.Resolve ();
});
retour différé.promes;
}
Intégration:
La copie de code est la suivante:
getrssaddress ('adresse.txt')
.Then (getrss)
.Thhen (Saverss)
.Catch (fonction (err) {
console.log (err);
});
expliquer:
Le modèle "différé / promesse" défini par la spécification Promise / A est le modèle "publier / abonné". Les événements de publication via l'objet différé peuvent être un événement de résolution d'achèvement ou un événement de rejet raté; Les abonnements complétés ou échoués correspondants sont effectués via l'objet Promise.
Dans les spécifications Promises / A, chaque tâche a trois états: par défaut (en attente), rempli (rempli) et échoué (rejeté).
1. L'état par défaut peut être transféré à l'état d'achèvement dans une direction. Ce processus est appelé résolution et la méthode correspondante est différée.resolve (promestorValue);
2. L'état par défaut peut également être transféré à l'état défaillant dans une direction. Ce processus est appelé rejet, et la méthode correspondante est différée.reject (raison);
3. Dans l'état par défaut, vous pouvez également déclarer les informations d'exécution des tâches via Deferred.Notify (Update), telles que les progrès de l'exécution;
4. Le transfert d'État est ponctuel. Une fois que la tâche est passée de l'attention initiale à d'autres états, il entrera le processus d'exécution de la tâche suivante.
Suivez le code ci-dessus.
Définissez un objet différé à travers quand.Defer.
var différé = quand.defer ();
Une fois les données asynchrones obtenues avec succès, un événement d'achèvement est publié.
Deferred.resolve (données);
Après l'échec de l'acquisition de données asynchrones, un événement raté est publié.
Deferred.Reject (ERR);
Et renvoyer l'objet Promise en tant qu'abonnement.
retour différé.promes;
L'abonnement est un abonnement terminé / échoué / notifié via la méthode alors de l'objet Promise.
getrssaddress ('adresse.txt')
.Then (getrss)
Ensuite, il y a trois paramètres, à savoir onduleux, onreject et onProgress
promesse.then (onfulllad, onrejected, onProgress)
La tâche précédente est la résolution (données) et la fonction onfullée sera déclenchée et les données seront utilisées comme paramètre.
Si la tâche précédente est rejetée (raison), alors le rejette sera déclenché et une raison sera reçue.
À tout moment, un seul de surfacturé et de réject peut être déclenché et une seule fois.
Pour gérer les exceptions, quand.js fournit également une méthode extrêmement pratique. Peut ensuite passer des erreurs. Lorsque plusieurs tâches sont exécutées en série, nous ne pouvons définir que dans le dernier projection dans le dernier. Vous pouvez également appeler la fonction de capture après le dernier puis pour attraper une exception de tâche.
C'est un moyen simple et clair de l'écrire.
La copie de code est la suivante:
getrssaddress ('adresse.txt')
.Then (getrss)
.Thhen (Saverss)
.Catch (fonction (err) {
console.log (err);
});
La promesse apporte une grande commodité à la programmation asynchrone, nous permettant de nous concentrer sur la mise en œuvre d'une seule tâche sans tomber dans le malheur pyramidal. Le code ci-dessus n'est qu'une utilisation de base. When.js fournit bien plus que les fonctions mentionnées dans cet article, veuillez vous référer à l'API officielle pour plus de détails.