2012-06-16 44 views
7

Tôi đang cố gắng sử dụng async và yêu cầu mô-đun với nhau nhưng tôi không hiểu cách gọi lại. Mã của tôi làSử dụng nodejs async và yêu cầu mô-đun

var fetch = function(file, cb) { 
    return request(file, cb); 
}; 

async.map(['file1', 'file2', 'file3'], fetch, function(err, resp, body) { 
    // is this function passed as an argument to _fetch_ 
    // or is it excecuted as a callback at the end of all the request? 
    // if so how do i pass a callback to the _fetch_ function 
    if(!err) console.log(body); 
}); 

Tôi đang cố gắng tìm nạp 3 tệp theo thứ tự và nối các kết quả. Đầu của tôi bị mắc kẹt trong các cuộc gọi lại mà tôi đã thử và các kết hợp khác nhau mà tôi có thể nghĩ đến. Google không giúp được gì nhiều.

Trả lời

32

Yêu cầu là chức năng không đồng bộ, nó không trả về một cái gì đó, khi công việc của nó được thực hiện, nó gọi lại. Từ request examples, bạn nên làm một cái gì đó như:

var fetch = function(file,cb){ 
    request.get(file, function(err,response,body){ 
      if (err){ 
       cb(err); 
      } else { 
       cb(null, body); // First param indicates error, null=> no error 
      } 
    }); 
} 
async.map(["file1", "file2", "file3"], fetch, function(err, results){ 
    if (err){ 
     // either file1, file2 or file3 has raised an error, so you should not use results and handle the error 
    } else { 
     // results[0] -> "file1" body 
     // results[1] -> "file2" body 
     // results[2] -> "file3" body 
    } 
}); 
+1

đang làm việc và rất dễ dàng để hiểu những gì tôi đã làm sai bây giờ :) nhờ – andrei

+0

liên kết của bạn để các ví dụ không hiển thị bất kỳ callbacks. Tất cả những gì họ làm là đăng nhập vào giao diện điều khiển. – Catfish

3

Trong ví dụ của bạn, fetch chức năng sẽ được gọi là ba lần, một lần cho mỗi người trong số các tên tập tin trong mảng truyền như tham số đầu tiên async.map. Tham số thứ hai, gọi lại cũng sẽ được chuyển thành fetch, nhưng gọi lại đó được cung cấp bởi khung không đồng bộ và bạn phải gọi nó khi chức năng fetch của bạn đã hoàn thành công việc, cung cấp kết quả của nó cho hàm gọi lại đó làm thông số thứ hai. Cuộc gọi lại mà bạn cung cấp làm thông số thứ ba cho số async.map sẽ được gọi khi cả ba cuộc gọi fetch gọi là cuộc gọi lại được cung cấp cho họ.

Xem https://github.com/caolan/async#map

Vì vậy, để trả lời câu hỏi cụ thể của bạn trong các mã, chức năng gọi lại bạn cung cấp được thực hiện như một callback tại sau đó kết thúc của tất cả các yêu cầu. Nếu bạn cần phải vượt qua một callback để fetch bạn muốn làm một cái gì đó như thế này:

async.map([['file1', 'file2', 'file3'], function(value, callback) { 
    fetch(value, <your result processing callback goes here>); 
}, ... 
Các vấn đề liên quan