2012-10-21 33 views
5

Tôi đã tìm kiếm cách sử dụng setTimeOut với các vòng lặp, nhưng không có nhiều cách sử dụng nó trong khi vòng lặp, và tôi không thấy lý do tại sao nên có nhiều sự khác biệt. Tôi đã viết một vài biến thể của mã sau đây, nhưng vòng lặp này dường như làm hỏng trình duyệt:setTimeout bên trong khi vòng

while(src == '') 
{ 
    (function(){ 
     setTimeout(function(){ 
     src = $('#currentImage').val(); 
     $("#img_"+imgIdx).attr('src',src); 
     }, 500); 
    }); 
} 

Tại sao? Về cơ bản, tôi có một hình ảnh được tạo động với thuộc tính nguồn cần thời gian để tải, vì vậy trước khi tôi có thể hiển thị nó, tôi cần tiếp tục kiểm tra xem nó có được tải hay không và chỉ khi đường dẫn có sẵn trong $('#currentImage'), thì để tôi hiển thị nó.

Mã này đã làm việc tốt trước khi tôi sử dụng một vòng lặp while, và khi tôi trực tiếp làm

setTimeout(function(){ 
    src = $('#currentImage').val(); 
    $("#img_"+imgIdx).attr('src',src); 
}, 3000); 

Nhưng tôi không muốn phải làm cho người dùng chờ 3 giây nếu tải có thể được thực hiện nhanh hơn, do đó tôi đặt setTimeOut trong một vòng lặp while và rút ngắn khoảng thời gian của nó, để tôi chỉ kiểm tra đường dẫn được tải sau mỗi nửa giây. Có chuyện gì vậy?

+0

Không, việc định giờ sẽ lấy hàm làm tham số và thực thi nó sau này. – jrdn

+0

@jrdn Tôi không nói về cái bên trong 'setTimeout', tôi đang nói về cái bên ngoài. BTW rằng chức năng khai báo là không cần thiết thực sự. –

+0

Ah. Điều đó nữa. Vì vậy, yeah, câu trả lời của tôi là sai. Nó chỉ là một vòng lặp vô hạn đơn giản cũ! – jrdn

Trả lời

3

Cảm ơn mọi người - tất cả các đề xuất đều hữu ích. Cuối cùng, tôi đã sử dụng setInterval như sau:

var timer; 
// code generating dynamic image index and doing ajax, etc 
var checker = function() { 
    var src = $('#currentImage').val(); 
    if(src !== '') { 
    $('#img_' + imgIdx).attr('src', src); 
     clearInterval(timer); 
    } 
}; 

timer = setInterval(checker, 500); 
+0

Xác nhận khoảng thời gian này thực sự bị xóa. ['window.clearInterval'] (https://developer.mozilla.org/en-US/docs/DOM/window.clearInterval) lấy một' intervalID' làm đối số của nó và không phải là _function_. –

+0

Tôi cũng nghĩ vậy ... nhưng điều này có hiệu quả. Đầu tiên nhìn thấy nó trong câu trả lời thứ hai ở đây: http://stackoverflow.com/questions/109086/stop-setinterval-call-in-javascript – user961627

+0

'i = 0; var fn = function() { console.log (++ i); nếu (i> 9) console.log ('xoá'), clearInterval (fn); }; setInterval (fn, 500); 'đi mãi mãi. –

5

Vấn đề có thể là bạn không kiểm tra mỗi nửa giây.

setTimeout lên lịch một hàm để chạy vào một thời điểm trong tương lai, nhưng nó không chặn, nó chỉ chạy sau. Vì vậy, trong vòng lặp của bạn trong khi bạn đang lập kế hoạch các chức năng để chạy nhanh như nó có thể lặp qua vòng lặp while, vì vậy bạn có thể tạo ra tấn của chúng.

Nếu bạn thực sự muốn kiểm tra sau mỗi nửa giây, hãy sử dụng setInterval mà không có vòng lặp thay thế.

+0

setInterval trả về một id. Khi bạn muốn dừng nó, sử dụng clearInterval (id); – jrdn

+0

https://developer.mozilla.org/en-US/docs/DOM/window.clearInterval – jrdn

+0

Cảm ơn bạn đã giải thích. Tôi lấy các khối setInterval đó? – user961627

9

Vòng lặp while đang tạo ra sự cố, như jrdn đang chỉ ra. Có lẽ bạn có thể kết hợp cả setInterval và setTimeout và khi src được lấp đầy, hãy xóa khoảng thời gian. Tôi đã đặt một số mã mẫu ở đây để trợ giúp, nhưng tôi không chắc chắn rằng nó có hoàn toàn phù hợp với mục tiêu của bạn hay không:

var src = ''; 
    var intervalId = window.setInterval(
     function() { 

      if (src == '') { 
       setTimeout(function() { 
        //src = $('#currentImage').val(); 
        //$("#img_" + imgIdx).attr('src', src); 
        src = 'filled'; 
        console.log('Changing source...'); 
        clearInterval(intervalId); 
       }, 500); 
      } 
      console.log('on interval...'); 
     }, 100); 

    console.log('stopped checking.'); 

Hy vọng điều này sẽ hữu ích.

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