2010-01-10 32 views
14

Đây là vấn đề của tôi. Tôi có chức năng này để kiểm tra máy chủ proxy.Tại sao cuộc gọi hàm của tôi nên được sắp xếp theo setTimeout được thực thi ngay lập tức?

function crawl() { 
    var oldstatus = document.getElementById('status').innerHTML; 
    document.getElementById('status').innerHTML = oldstatus + "Crawler Started...<br />"; 
    var url = document.getElementById('url').value; 
    var proxys = document.getElementById('proxys').value.replace(/\n/g,','); 

    var proxys = proxys.split(","); 

    for (proxy in proxys) { 
     var proxytimeout = proxy*10000; 
     setTimeout(doRequest(url,proxys[proxy]), proxytimeout); 
    } 
} 

Tôi muốn hàm 'doRequest()' được gọi trong khoảng 10 giây nhưng ngay cả với hàm setTimeout(), hàm được gọi ngay lập tức.

Bất kỳ ý tưởng nào đều được chào đón, cảm ơn.

PS: Ngay cả khi tôi đặt giá trị tùy ý cho 'proxytimout', nó không có hiệu lực.

Trả lời

13

Khi bạn cung cấp hàm cho setTimeout trong biểu mẫu đó, hàm được thực hiện thay vì truyền cho setTimeout. Bạn có ba lựa chọn thay thế để làm cho nó làm việc:

Give đầu tiên chức năng, sau đó thời gian chờ và các thông số như các đối số cuối cùng:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]); 

Hoặc chỉ cần viết một chuỗi sẽ được đánh giá:

setTimeout('doRequest('+url+','+proxys[proxy]+')', proxytimeout); 

Kiểu thứ ba là chuyển một hàm ẩn danh gọi hàm. Lưu ý rằng trong trường hợp này, bạn phải làm điều đó trong một đóng cửa để ngăn chặn các giá trị từ việc thay đổi trong vòng lặp, do đó nó được một chút khôn lanh:

(function(u, p, t) { 
    setTimeout(function() { doRequest(u, p); }, t); 
})(url, proxys[proxy], proxytimeout); 

Định dạng thứ hai là một chút hacky, nhưng hoạt động tuy nhiên nếu các đối số là các giá trị vô hướng (chuỗi, ints, v.v.). Định dạng thứ ba có một chút không rõ ràng, vì vậy trong trường hợp này, tùy chọn đầu tiên rõ ràng sẽ hoạt động tốt nhất cho bạn.

+3

Đúng nếu tôi sai, nhưng vì điều này xảy ra bên trong một vòng lặp, phương pháp thứ hai bạn đã đưa ra sẽ không hoạt động. Giá trị của 'proxy' sẽ thay đổi vì không có đóng cửa nào được tạo. – nickf

+0

@nickf: Tôi chuẩn bị nói điều đó. Ngoài ra, tùy chọn thứ ba vi phạm 'eval là cái ác'. – SLaks

+0

@nickf, bạn là sự thật, tôi đã bỏ qua điểm đó. Tôi đã cập nhật câu trả lời của mình. –

0

Dòng này ở đây là vấn đề:

setTimeout(doRequest(url,proxys[proxy]), proxytimeout); 

Viết doRequest() là thực sự gọi hàm. Những gì bạn muốn là để vượt qua các chức năng chính nó:

setTimeout(doRequest, proxytime, url, proxys[proxy]); 
0

Bạn hiểu sai chức năng setTimeout.

Chức năng setTimeout có chức năng và thực hiện sau.
Bằng cách viết setTimeout(doRequest(url,proxys[proxy]), proxytimeout), bạn đang _call chức năng doRequest (ngay lập tức) và chuyển kết quả (giả sử rằng nó trả về một hàm khác) thành setTimeout.

Bạn cần phải vượt qua các thông số doRequest 's để setTimeout, như thế này:

setTimeout(doRequest, proxytimeout, url, proxys[proxy]); 

này sẽ vượt qua setTimeout các doRequest chức năng riêng của mình (mà không gọi nó lần đầu tiên), và cũng có thể sẽ vượt qua nó các thông số để cung cấp cho doRequest khi nó cuối cùng gọi nó.

Các vấn đề liên quan