2012-04-15 15 views
7

He estado tratando de usar node.js para recorrer una matriz de ciudades y hacer una solicitud iterativa a google para obtener instrucciones sobre cada una (entonces JSON.parse para resumir los tiempos de unidad). Necesito encontrar una manera de hacer esto sincrónicamente, de lo contrario solo solicitaré toda la información de Google en cada ciudad a la vez. Encontré un buen patrón para usar en http://tech.richardrodger.com/2011/04/21/node-js-%E2%80%93-how-to-write-a-for-loop-with-callbacks/ pero no puedo hacer que la devolución de llamada funcione. Como puede ver, estoy usando una función 'mostrar' para probar lo mismo. Mi código es el siguiente:Uso de ciclo de patrón recursivo con node.js

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) 

El problema que tengo es que sólo la primera ciudad de la matriz es la producción y la devolución de llamada/iteración no procede. ¿Alguna idea de dónde salgo mal, por favor?

+2

he arreglado un poco ahora, disculpas por la dejadez, la primera vez que he publicado una pregunta. –

+0

Su ejemplo tiene algunos errores: el número de parámetros para 'fs.writeFile' es incorrecto, su función' show' toma 1 parámetro pero usted lo llama con 2. – mihai

+0

Su función show() no llama a su devolución de llamada y por lo tanto no recursión en el ejemplo. –

Respuesta

11

También estaba frente a temas como este, por lo que he escrito una función de devolución de llamada recursiva que actuará como una de pero puedes controlar cuándo incrementar. El siguiente es ese módulo, nombre que syncFor.js e incluir esto en su programa

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); 
    }); 
}; 
+0

creó un proyecto de git, siga este enlace https://github.com/subramanya2107/SyncFor – subbu

14

Gracias por los punteros, fue claramente por mi poca comprensión de las devoluciones de llamada en javascript. Simplemente leyendo los patrones de JavaScript de O'Reilly y tocando las secciones de 'Patrón de devolución de llamada' - ¡doo!

Para cualquier persona que no sabe, así es como el código funcionará:

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) 
Cuestiones relacionadas