Tôi chắc chắn rằng sự cố của tôi dựa trên sự thiếu hiểu biết về lập trình asynch trong node.js nhưng ở đây sẽ xảy ra.Node.JS: Làm thế nào để chuyển các biến thành các cuộc gọi lại không đồng bộ?
Ví dụ: Tôi có danh sách liên kết tôi muốn thu thập dữ liệu. Khi mỗi yêu cầu asynch trả về, tôi muốn biết URL đó là gì. Tuy nhiên, có lẽ do điều kiện chủng tộc, mỗi yêu cầu sẽ trả về với URL được đặt thành giá trị cuối cùng trong danh sách.
var links = ['http://google.com', 'http://yahoo.com'];
for (link in links) {
var url = links[link];
require('request')(url, function() {
console.log(url);
});
}
sản lượng dự kiến:
http://google.com
http://yahoo.com
đầu ra thực tế:
http://yahoo.com
http://yahoo.com
Vì vậy, câu hỏi của tôi là một trong hai:
- Làm thế nào để vượt qua url (theo giá trị) đến chức năng gọi lại? HOẶC
- Cách thích hợp để ghép các yêu cầu HTTP để chúng chạy tuần tự là gì? HOẶC
- Tôi còn thiếu cái gì khác?
PS: Đối với 1. Tôi không muốn một giải pháp kiểm tra thông số của cuộc gọi lại mà là cách tổng quát gọi lại các biến 'từ phía trên'.
Đó không phải là phạm vi. Đó là về đóng cửa. Rất nhiều ngôn ngữ khác không có phạm vi chặn nhưng không phải đối mặt với vấn đề này do thiếu đóng cửa. – slebetman
Vấn đề là nếu JavaScript hỗ trợ phạm vi khối, thì quyền truy cập đóng cửa vào 'url' trong hàm gọi lại của mã OP sẽ hoạt động vì mỗi lần lặp của vòng lặp sẽ nhận biến' url' riêng của nó (như trong C#). – JohnnyHK
Yêu cầu chỉ trong đó ngắn gọn, trong mã của tôi tất cả yêu cầu là lúc đầu. – Marc