2011-12-30 33 views
11

Đối với một ứng dụng web đơn giản cần làm mới các phần dữ liệu được trình bày cho người dùng trong một khoảng thời gian nhất định, có bất kỳ nhược điểm nào chỉ bằng cách sử dụng setInterval() để lấy một json từ điểm cuối thay vì sử dụng một khung bỏ phiếu thích hợp?Sử dụng setInterval() để thực hiện việc bỏ phiếu liên tục đơn giản

Vì lợi ích của ví dụ, giả sử tôi đang làm mới trạng thái của công việc xử lý cứ sau 5 giây.

+6

tôi sẽ sử dụng 'setTimeout' và luôn gọi nó là khi nhận được phản hồi trước đó. Bằng cách này bạn tránh tắc nghẽn hoặc xếp chồng chức năng hoặc bất cứ điều gì bạn muốn gọi nó. –

+0

Tôi đã thực hiện nó giống như @ FelixKling nói và hoạt động như một sự quyến rũ. Thử nó! – Alfabravo

+0

Tuyệt vời! Có thể @FelixKling, bạn có thể vui lòng đăng bài đó làm câu trả lời và tôi sẽ chấp nhận không? – Sologoub

Trả lời

25

Từ nhận xét của tôi:

Tôi sẽ sử dụng setTimeout[docs] và luôn gọi khi nhận được phản hồi trước đó. Bằng cách này bạn tránh tắc nghẽn hoặc xếp chồng chức năng hoặc bất cứ điều gì bạn muốn gọi nó, trong trường hợp yêu cầu/phản hồi mất nhiều thời gian hơn khoảng thời gian của bạn.

Vì vậy, một cái gì đó như thế này:

function refresh() { 
    // make Ajax call here, inside the callback call: 
    setTimeout(refresh, 5000); 
    // ... 
} 

// initial call, or just call refresh directly 
setTimeout(refresh, 5000); 
+3

Một phân tích tốt đẹp ở đây về lý do tại sao tránh 'setInterval' là một ý tưởng hay: http://weblogs.asp.net/bleroy/archive/2009/05/14/setinterval-is-moderately-evil.aspx –

+0

chúng ta nên sử dụng' setTimeout (làm mới, 5000); 'hai lần? Tôi có nghĩa là một sau khi cuộc gọi ban đầu và sau đó một lần nữa trong chức năng được gọi là? – David

1

Tôi biết đây là một câu hỏi cũ nhưng tôi vấp trên nó, và theo cách StackOverflow làm việc tôi nghĩ rằng tôi có thể cải thiện nó. Bạn có thể muốn xem xét một giải pháp tương tự như what's described here được gọi là bỏ phiếu dài. HOẶC một giải pháp khác là WebSockets (một trong những triển khai tốt nhất của websockets với mục tiêu chính là làm việc trên tất cả các trình duyệt) socket.io.

Giải pháp đầu tiên về cơ bản được tóm tắt khi bạn gửi một yêu cầu AJAX và chờ phản hồi trước khi gửi một yêu cầu bổ sung, sau đó một khi phản hồi đã được gửi, hãy xếp hàng truy vấn tiếp theo.

Trong khi đó, trên chương trình phụ trợ, bạn không trả lại phản hồi cho đến khi trạng thái thay đổi. Vì vậy, trong kịch bản của bạn, bạn sẽ sử dụng một vòng lặp while sẽ tiếp tục cho đến khi trạng thái thay đổi, sau đó trả lại trạng thái đã thay đổi cho trang. Tôi thực sự thích giải pháp này. Như câu trả lời được liên kết ở trên cho thấy, đây là những gì facebook hiện (hoặc ít nhất đã làm trong quá khứ).

socket.io về cơ bản là jQuery của Websockets, do đó bất kỳ trình duyệt nào mà người dùng của bạn ở trong đó đều có thể thiết lập kết nối ổ cắm có thể đẩy dữ liệu đến trang (mà không cần bỏ phiếu). Điều này là gần gũi hơn với một thông báo tức thì của Blackberry, mà - nếu bạn đang đi cho ngay lập tức, đó là giải pháp tốt nhất.

+0

Mặc dù socket.io có thể là tốt, nó không phải là giải pháp cho websockets chỉ là một giải pháp trong số rất nhiều. Tất cả trong số họ (gần như) tốt theo cách riêng của họ và bạn có thể xem xét các khuôn khổ khác nhau tùy thuộc vào nhiệm vụ để giải quyết. – Uffe

+0

Bất cẩn, cập nhật để phản ánh ý định đề cập đến socket.io – th3byrdm4n

1

Bạn có thể làm như thế này:

var i = 0, loop_length = 50, loop_speed = 100; 

function loop(){ 
    i+= 1; 
    /* Here is your code. Balabala...*/ 
    if (i===loop_length) clearInterval(handler); 
} 

var handler = setInterval(loop, loop_speed); 
2

Một non-blocking chức năng thăm dò đơn giản có thể được thực hiện trong các trình duyệt gần đây sử dụng Promises:

var sleep = time => new Promise(resolve => setTimeout(resolve, time)) 
var poll = (promiseFn, time) => promiseFn().then(
      sleep(time).then(() => poll(promiseFn, time))) 

// Greet the World every second 
poll(() => new Promise(() => console.log('Hello World!')), 1000) 
+0

. công trinh. Nếu sau một thời gian, tôi quyết định ngừng thực hiện bằng một cú nhấp chuột, ví dụ, làm thế nào tôi có thể làm điều đó, xin vui lòng? – Marcel

+0

@Marcel Cảm ơn. Câu trả lời ngắn gọn là điều đó là không thể (https://stackoverflow.com/a/29479435/1054423). – bschlueter

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