À l'aide Asynchrone en cascade dans node.js
J'ai 2 fonctions que je l'exécute de façon asynchrone. Je voudrais écrire à l'aide de modèle en cascade. La chose est, je ne sais pas comment..
Voici mon code :
var fs = require('fs');
function updateJson(ticker, value) {
//var stocksJson = JSON.parse(fs.readFileSync("stocktest.json"));
fs.readFile('stocktest.json', function(error, file) {
var stocksJson = JSON.parse(file);
if (stocksJson[ticker]!=null) {
console.log(ticker+" price : " + stocksJson[ticker].price);
console.log("changing the value...")
stocksJson[ticker].price = value;
console.log("Price after the change has been made -- " + stocksJson[ticker].price);
console.log("printing the the Json.stringify")
console.log(JSON.stringify(stocksJson, null, 4));
fs.writeFile('stocktest.json', JSON.stringify(stocksJson, null, 4), function(err) {
if(!err) {
console.log("File successfully written");
}
if (err) {
console.error(err);
}
}); //end of writeFile
} else {
console.log(ticker + " doesn't exist on the json");
}
});
} //end of updateJson
Aucune idée de comment puis-je l'écrire à l'aide de la cascade, donc je vais être en mesure de contrôler ce? Écrivez-moi quelques exemples parce que je suis nouveau node.js
- Fondamentalement, vous voulez savoir où dans votre code, vous devez appeler votre deuxième fonction pour le faire exécuter seulement lorsque le premier a terminé le travail pour écrire dans un fichier, et peut-être répéter cette procédure sur un autre asynchrone fonction, non?
- Oui, c'est vrai
Vous devez vous connecter pour publier un commentaire.
D'abord identifier les étapes et de les écrire en asynchrone fonctions (prenant un rappel de l'argument)
lire le fichier
traiter le fichier (j'ai enlevé la plupart de la console.journal dans les exemples)
Notez que je n'ai pas de traitement spécifique des erreurs ici, je vais prendre avantage de l'asynchrone.une cascade de centraliser la gestion d'erreur au même endroit.
Également veiller à ce que si vous avez (if/else/interrupteur/...) branches en asynchrone fonction, il toujours appeler la fonction de rappel d'un (et un seul) de temps.
Brancher le tout avec async.cascade
Propre exemple
Le code précédent était trop verbeux pour rendre les explications plus claires. Voici une nettoyés exemple:
J'ai laissé les noms de fonction, car elle contribue à la lisibilité et à l'aide de débogage avec des outils comme google chrome débogueur.
Si vous utilisez trait de soulignement (sur ngp), vous pouvez également remplacer la première fonction avec
_.partial(fs.readFile, 'stocktest.json')
processFile
est de mettre lefile
de la fonction de rappel de lafs.readFile
droit? Dois-je déclarer tout d'abord que toutes les fonctions puis de les utiliser en cascade? Vous avez donné 2 exemples d'utilisation de la cascade..waterfall function
dans unfor loop
? Est-ce qu'il va remplir toutes les opérations à l'intérieur avant la prochaine itération de la boucle?updateJsonAsync(options,callback)
) et de l'appeler avec quelque chose commeasync.eachSeries( [{ticker:...,value:...},...], updateJsonAsync, function(err){/*handle error*/} )
updateJsonAsync(ticker, value, callback)
droit? Le 2ème argument que la cascade obtenir un rappel de ma fonction wrapper est-il juste?iterator(item, callback)
(voir la documentation), donc un seul argument avant le rappel. Et à droite, vous pouvez utiliser la fonction de rappel de votre fonction wrapper de la 2ème argument de la cascade.fs.readFile.bind(null, 'stocktest.json')
2. Utiliser asynchrone.appliquer() comme suit:async.apply(fs.readFile, 'stocktest.json')
D'abord et avant tout, assurez-vous que vous lire la documentation concernant
async.cascade
.Maintenant, il ya quelques éléments clés à propos de la chute d'eau de contrôle de flux:
err
) est rencontré à toute opération dans le flux de tableau, il court-circuit et immédiatement appeler le "complète"/"terminer"/"fait"callback
.err
argument ajouté à la place d'un "intermédiaire" callback qui est joint en annexe.cbAsync
dans mes exemples) doit être invoquée lorsque vous êtes prêt à passer: Le premier paramètre est une erreur, le cas échéant, et la deuxième (troisième, quatrième, etc...) paramètre sera toutes les données que vous souhaitez passer à l'opération suivante.L'objectif premier est d'obtenir votre code de travail presque mot pour mot parallèlement à l'introduction de
async.waterfall
. J'ai décidé de supprimer tous vosconsole.log
états et simplifiée de votre erreur de manipulation. Voici la première itération (code non testé):La deuxième itération divise l'opération de débit un peu plus. Il le met dans de plus petits une seule opération tournée des morceaux de code. Je ne vais pas la commenter, il parle de lui-même (de nouveau, non testé):
La dernière itération de court-mains beaucoup de cela avec l'utilisation de certains
bind
astuces pour diminuer la pile d'appel et d'accroître la lisibilité (OMI), également non testé:for loop
l'ensemble de lafunction
? Est-il d'aller au travail , je veux dire, est-il en train de terminer toutes les opérations à l'intérieur jusqu'à ce que la deuxième itération de la boucle?for
boucle, si vous le faites alors plusieursasync.waterfall
les opérations seront exécutées en parallèle. Au lieu d'utiliserasync.eachSeries
,async.whilst
, ouasync.until
. Ces sont l'équivalent d'unfor
boucle, mais attendre jusqu'à ce que async ducallback
est invoquée avant de passer à l'itération suivante (en d'autres termes, unfor
une boucle de rendement).var tickers = [{ticker:'GOOG',value:1},{ticker:'YHOO',value:2}]; async.eachSeries(tickers,updateJson,function(err){/*done*/});
, mais vous aurez à changer votreupdateJson
àfunction updateJson(obj,callback){var ticker = obj.ticker,value = obj.value;async.waterfall([/* flow operations go here */],callback)};
Fondamentalement nodejs (et, plus généralement, javascript), les fonctions qui nécessitent un peu de temps à s'exécuter (que ce soit pour les I/O ou l'unité centrale de traitement) sont généralement asynchrone, la boucle d'événements (pour faire simple est une boucle qui vérifie en permanence pour les tâches à exécuter) peut appeler la fonction à droite en dessous de la première, sans être bloquées pour une réponse. Si vous êtes familier avec d'autres langages comme le C ou le Java, vous pouvez penser à un asynchrones fonction comme une fonction qui s'exécute sur un autre thread (il n'est pas forcément vrai en javascript, mais le programmeur ne devrait pas s'en soucier) et lorsque l'exécution se termine ce fil informe le principal (la boucle d'événements) que le travail est fait et il a les résultats.
Comme l'a dit une fois que la première fonction a terminé son travail, il doit être en mesure de notifier que son travail est terminé et il le fait en invoquant la fonction de rappel vous passer. pour faire un exemple:
le flux d'exécution pourrait appeler: asyncFunction1, asyncFunction2 et toutes les fonctions ci-dessous jusqu'à ce que asyncFunction1 extrémités, puis la fonction de callback qui est passé comme le dernier paramètre à asyncFunction1 est appelé à faire quelque chose avec des données si aucune erreur n'est survenue.
Donc, pour faire 2 ou plus asynchrone fonctions exécuter l'un après l'autre quand ils ont terminé, vous devez les appeler à l'intérieur de leurs fonctions de rappel:
result1 est la valeur de retour de asyncTask1 et result2 est la valeur de retour de asyncTask2. Vous pouvez de cette façon nid combien asynchrone fonctions que vous voulez.
Dans votre cas, si vous souhaitez une autre fonction qui doit être appelée après updateJson (), vous devez appeler après cette ligne: