2012-04-15 7 views
7

Ich habe versucht, node.js zu verwenden, um durch ein Array von Städten zu iterieren und eine iterative Anfrage nach google für Richtungen auf jedem zu machen (ich dann JSON.parse, um die Laufwerkzeiten zu abstrahieren). Ich muss einen Weg finden, dies synchron zu tun, sonst werde ich nur alle Informationen von Google auf jeder Stadt auf einmal anfordern. Ich habe ein gutes Muster gefunden, um es unter http://tech.richardrodger.com/2011/04/21/node-js-%E2%80%93-how-to-write-a-for-loop-with-callbacks/ zu verwenden, kann aber den Callback nicht zum Laufen bringen. Wie Sie sehen können, verwenden Sie eine "Show" -Funktion, um dasselbe zu testen. Mein Code ist wie folgt:Verwenden rekursiver Musterschleife mit 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) 

Das Problem, das ich habe ist, dass nur die erste Stadt aus dem Array ausgegeben und die Rückruf/Iteration nie abläuft. Irgendwelche Ideen, wo ich bitte falsch liege?

+2

ich es ein bisschen jetzt in Ordnung gebracht haben, Entschuldigungen für die Schlamperei, erste Mal, dass ich eine Frage gestellt habe. –

+0

Ihr Beispiel hat einige Fehler: die Anzahl der Parameter zu 'fs.writeFile' ist falsch, Ihre Funktion' show' nimmt 1 Parameter, aber Sie rufen sie mit 2. – mihai

+0

Ihre Funktion show() ruft nicht ihren Callback auf und daher keine Rekursion im Beispiel. –

Antwort

11

ich auch Fragen wie diese gegenüber war, so habe ich eine rekursive Callback-Funktion geschrieben, die als handeln für Schleife, aber Sie können steuern, wann zu inkrementieren. Im Folgenden ist das Modul, Namen wie syncFor.js und nimmt diese in Ihrem Programm

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

erstellt ein Git-Projekt, folgen Sie diesem Link https://github.com/subramanya2107/SyncFor – subbu

14

Danke für die Hinweise, war eindeutig auf mein schlechtes Verständnis von Rückrufen in Javascript. Lesen Sie einfach JavaScript-Muster von O'Reilly und klicken Sie auf die Abschnitte "Callback-Muster" - doh!

Für alle, die nicht wissen, das ist, wie der Code funktioniert:

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)