2012-04-15 59 views
7

ive đang cố gắng sử dụng node.js để lặp qua một mảng thành phố và thực hiện yêu cầu lặp lại cho google để tìm chỉ đường trên mỗi (sau đó là JSON.parse để trừu tượng số lần truyền). Tôi cần phải tìm một cách để làm điều này đồng bộ như nếu không tôi sẽ chỉ yêu cầu tất cả các thông tin từ google trên mỗi thành phố cùng một lúc. Tôi đã tìm thấy một mô hình tốt để sử dụng tại http://tech.richardrodger.com/2011/04/21/node-js-%E2%80%93-how-to-write-a-for-loop-with-callbacks/ nhưng không thể gọi lại để hoạt động. Như bạn có thể thấy, tôi sử dụng hàm 'show' để kiểm tra tương tự. Mã của tôi như sau:Sử dụng vòng lặp mẫu đệ quy với 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) 

Vấn đề tôi có là thành phố đầu tiên của mảng là đầu ra và gọi lại/lặp lại không bao giờ tiếp tục. Bất kỳ ý tưởng mà im đi sai xin vui lòng?

+2

Tôi đã dọn dẹp một chút ngay bây giờ, xin lỗi vì sự cẩu thả, lần đầu tiên tôi đã đăng câu hỏi. –

+0

Ví dụ của bạn có một số sai lầm: số parametrs để 'fs.writeFile' là không chính xác, hàm của bạn' show' nhận 1 tham số nhưng bạn gọi nó với 2. – mihai

+0

Hàm show show() không gọi nó là gọi lại và do đó không đệ quy trong ví dụ. –

Trả lời

11

Tôi cũng đã phải đối mặt với các vấn đề như thế này, vì vậy tôi đã viết một hàm callback đệ quy mà sẽ hoạt động như một cho nhưng bạn có thể kiểm soát thời điểm tăng. Sau đây là mô-đun, tên là syncFor.js và bao gồm điều này trong chương trình của bạn

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

đã tạo một dự án git, theo liên kết này https://github.com/subramanya2107/SyncFor – subbu

14

Cảm ơn con trỏ, rõ ràng là sự hiểu biết kém của tôi về các cuộc gọi lại trong javascript. Chỉ cần đọc các mẫu JavaScript của O'Reilly và nhấn vào phần 'Mẫu gọi lại' - doh!

Đối với những ai không biết, đây là cách mã sẽ làm việc:

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) 
Các vấn đề liên quan