Utilisation de la boucle de modèle récursive avec node.js

J’ai essayé d’utiliser node.js pour parcourir différentes villes et faire une requête itérative pour rechercher des instructions sur Google (puis JSON.parse pour résumer les temps de conduite). Je dois trouver un moyen de le faire de manière synchrone, sinon je demanderai simplement toutes les informations de Google sur chaque ville à la fois. J’ai trouvé un bon modèle à utiliser sur http://tech.richardrodger.com/2011/04/21/node-js-%E2%80%93-how-to-write-a-for-loop-with-callbacks / mais ne peut pas obtenir le rappel au travail. Comme vous pouvez le voir, j’utilise une fonction ‘show’ pour tester la même chose. Mon code est le suivant:

var request = require('request'); var fs = require('fs'); var arr = ['glasgow','preston','blackpool','chorley','newcastle','bolton','paris','york','doncaster']; //the function I want to call on each city from [arr] function getTravelTime(a, b,callback){ request('https://maps.googleapis.com/maps/api/directions/json?origin='+a+'&destination='+b+'&region=en&sensor=false',function(err,res,data){ var foo = JSON.parse(data); var duration = foo.routes[0].legs[0].duration.text; console.log(duration); }); }; function show(b){ fs.writeFile('testing.txt',b); }; function uploader(i){ if( i < arr.length ){ show( arr[i],function(){ uploader(i+1); }); } } uploader(0) 

Le problème que j’ai, c’est que seule la première ville du tableau est générée et que le rappel / l’itération ne se poursuit jamais. Des idées où je me trompe?

Je faisais également face à des problèmes de ce type. J’ai donc écrit une fonction de rappel récursive qui servira de boucle for, mais vous pouvez contrôler le moment de l’incrémentation. Ce qui suit est ce module, nommez-le syncFor.js et incluez-le dans votre programme

 module.exports = function syncFor(index, len, status, func) { func(index, status, function (res) { if (res == "next") { index++; if (index < len) { syncFor(index, len, "r", func); } else { return func(index, "done", function () { }) } } }); } //this will be your program if u include this module var request = require('request'); var fs = require('fs'); var arr = ['glasgow', 'preston', 'blackpool', 'chorley', 'newcastle', 'bolton', 'paris', 'york', 'doncaster']; var syncFor = require('./syncFor'); //syncFor.js is stored in same directory //the following is how u implement it syncFor(0, arr.length, "start", function (i, status, call) { if (status === "done") console.log("array iteration is done") else getTravelTime(arr[i], "whatever", function () { call('next') // this acts as increment (i++) }) }) function getTravelTime(a, b, callback) { request('https://maps.googleapis.com/maps/api/directions/json?origin=' + a + '&destination=' + b + '&region=en&sensor=false', function (err, res, data) { var foo = JSON.parse(data); var duration = foo.routes[0].legs[0].duration.text; callback(); // call the callback when u get answer console.log(duration); }); }; 

Merci pour les indications, était clairement dû à ma mauvaise compréhension des rappels en javascript. Il suffit de lire les modèles JavaScript d’O’Reilly et de cliquer sur les sections «Modèle de rappel» – doh!

Pour ceux qui ne le savent pas, voici comment le code fonctionnera:

 var arr = ['glasgow','preston','blackpool','chorley','newcastle','bolton','paris','york','doncaster']; function show(a,callback){ console.log(a); callback(); } function uploader(i){ if( i < arr.length ){ show(arr[i], function(){ uploader(i+1) }); }; } uploader(0)