2012-02-09 67 views
11

Giả sử tôi có setInterval(PostToServer, 1000);. Chức năng PostToServer làm cho bài đăng ajax, có thể mất nhiều thời gian hơn một giây. Vì vậy, những gì xảy ra sau đó: một cuộc gọi thứ hai được thực hiện trong khi người đầu tiên đã không hoàn thành hoặc kết thúc cuộc gọi được chờ đợi trước khi thực hiện một cái mới?javascript setInterval: các cuộc gọi có trùng lặp không?

Trả lời

7

Cuộc gọi trùng lặp.

setInterval đảm bảo rằng các chức năng được chạy thường xuyên, mà không cần chờ kết quả trước đó.

Nếu bạn muốn chờ phản hồi, hãy thay đổi phương thức khoảng thời gian thành một lần đẩy. Khi thời gian trôi qua VÀ máy chủ đã phản hồi, hãy yêu cầu lại.

Vì phản hồi của máy chủ sẽ không thay đổi quá nhiều ngay sau phản hồi, bạn cũng có thể thêm trình xử lý setTimeout vào chức năng gọi lại của phương thức AJAX của mình.

+0

@ jfriend00 Câu trả lời này là chính xác. OP hỏi xem một hàm trong 'setInterval' có chờ kết thúc của yêu cầu AJAX từ phương thức' setInterval' trước đó không, ** không ** cho phần cuối của hàm trong lời gọi 'setInterval' trước đó. –

+1

Tôi ban đầu đọc sai câu hỏi và đã rút lại nhận xét và đánh giá của tôi. Ban đầu tôi nghĩ rằng họ đã hỏi liệu hai cuộc gọi gọi lại setInterval có thể chồng lên nhau (mà họ không thể). Tôi không thấy rằng họ đang nói về các cuộc gọi ajax được kích hoạt trong một khoảng thời gian. – jfriend00

8

Javascript là một luồng đơn (ngoại trừ công nhân web HTML5 không tham gia vào vấn đề này) với hàng đợi sự kiện. Cuộc gọi tiếp theo từ setInterval() sẽ không bao giờ bắt đầu cho đến khi cuộc gọi trước được thực hiện. Chỉ có một người có thể hoạt động cùng một lúc.

Khi thời gian cho khoảng thời gian của bạn xảy ra, bên trong công cụ JS bộ đếm thời gian kích hoạt và sự kiện được thêm vào hàng đợi sự kiện javascript. Khi luồng JS đang thực hiện đang chạy kết thúc (và không phải trước đó), công cụ JS đi và tìm nạp sự kiện tiếp theo từ hàng đợi sự kiện và bắt đầu luồng thực thi JS đó. Do đó, hai đường dẫn thực hiện trong JS sẽ không bao giờ chồng lên nhau hoặc đang diễn ra cùng một lúc. Vì vậy, hai cuộc gọi hàm từ setInterval() sẽ không bao giờ chồng lên nhau. Cái thứ hai sẽ không bắt đầu cho đến khi cái đầu tiên được thực hiện. Tuy nhiên, liên quan đến câu hỏi của bạn, điều này có nghĩa là hai khoảng thời gian từ setInterval() sẽ không bao giờ chồng lên nhau, nhưng nếu bạn đang thực hiện cuộc gọi ajax không đồng bộ trên bộ hẹn giờ đầu tiên và bắt đầu cuộc gọi ajax ngay lập tức, và khoảng thời gian thứ hai cháy trước khi cuộc gọi ajax không đồng bộ đầu tiên đã kích hoạt chức năng hoàn thành của nó, sau đó cuộc gọi ajax của bạn sẽ hoặc có thể chồng lên nhau.

Nếu bạn muốn ngăn nhiều cuộc gọi ajax đang bay cùng lúc, bạn sẽ phải viết một số mã để ngăn chặn cụ thể bằng cách không kích hoạt cuộc gọi ajax thứ hai cho đến khi cuộc gọi trước đó hoàn thành hoặc bằng cách bỏ qua bất kỳ cuộc gọi ajax nào nếu cuộc gọi trước đó vẫn diễn ra.

Xem this post để biết thêm thông tin về hàng đợi sự kiện JS và cách hoạt động của hàng đợi.

1

Có, nó trùng lặp. Bạn có thể sử dụng setTimeout trong hàm PostToServer để chắc chắn nó không trùng lặp, nhưng vấn đề là nó chạy yêu cầu và sau đó chờ 1s và sau đó chạy lại yêu cầu. Vì vậy, nó không chạy mỗi giây chính xác.

Để biết thêm thông tin, hãy xem video này của Paul Ailen: http://youtu.be/i_qE1iAmjFg?t=7m46s

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