2012-04-21 39 views
8

Tôi đang tham chiếu đến this. Mọi thứ vẫn chưa rõ ràng.Javascript setTimeout có dừng thực thi tập lệnh khác không

  • Tôi có chức năng JS fillTree() cập nhật cây, hộp kiểm có hộp kiểm.
  • Tôi có một chức năng khác checkSelectedBoxes() được thực hiện trên window.onload để kiểm tra các hộp kiểm đã chọn.
  • Hiện có rất nhiều chức năng khác được kết nối.

Câu hỏi của tôi:

  • Nếu tôi đang sử dụng setTimeout() sẽ chức năng kịch bản khác cũng dừng lại và chờ đợi cho chức năng của tôi để kết thúc tải?

gì có thể là trường hợp này:

function fillTree(){...} 
function checkSelectedBoxes(){...} 

fillTree(); // This take time to get data. onLoad() doesnt work. 
setTimeout(function(){ checkSelectedBoxes() },5000); 

này trả về giá trị null tôi thậm chí sau khi tăng khoảng thời gian. Có fillTree() tạm dừng thực thi không?

+0

Không, 'setTimeout' không tạm dừng thực thi mã khác. Nếu bạn đang cố gắng gọi 'checkSelectedBoxes()' khi hoàn thành 'fillTree()' tại sao không truyền nó như một tham số gọi lại, hoặc đơn giản là ở cuối 'fillTree()'? –

+0

@RoryMcCrossan cảm ơn, câu trả lời của bạn có vẻ là giải pháp tốt nhất có thể nhưng CMS của tôi đang sử dụng và cây được đặt trong một số tệp js khác mà tôi không can thiệp vì nó được sử dụng nhiều chức năng khác và các trường hợp có thể không phải lúc nào giống như –

Trả lời

9

Không, setTimeout không chờ bạn (do đó, JS không có chức năng tạm dừng). Những gì setTimeout không được đặt sang một bên nhiệm vụ đó sau đó và cho phép dòng tiếp theo được thực hiện. khi thời gian chờ đó đạt đến , nó sẽ chèn tác vụ đó vào dòng thực thi. và khi không có mã nào khác đang chạy, nó thực hiện chức năng được chỉ định.

điều bạn muốn làm là gọi lại số fillTree() và thực hiện khi hoàn tất.

function fillTree(callback){ 

    //do something very long 

    callback(); //execute passed function when it's done 
} 

fillTree(function(){ 
    checkSelectedBoxes(); //executes only when fillTree finishes 
}) 
+0

Cảm ơn. Điều đó xóa tất cả mọi thứ. Tôi sẽ chấp nhận trong 8 phút: P. Ngoài ra câu hỏi không tuyên bố như vậy, nhưng bạn có thể tư vấn cho tôi trường hợp như vậy là những gì cần được tiếp cận của tôi? –

+0

fillTree làm gì chính xác? nó là một cuộc gọi Ajax? DOM đi bộ? mất bao lâu? – Joseph

+3

"nó chèn tác vụ đó vào dòng thực hiện" không hoàn toàn chính xác. Nó sẽ không làm gián đoạn mã người dùng cũng không chạy đồng thời; nó sẽ chỉ chạy khi không có mã người dùng JS nào đang chạy và đã hết thời gian chờ. – Lucero

1

nó một CMS tôi đang sử dụng và cây được đặt trong tập tin một số js khác mà tôi không can thiệp vào vì nó được sử dụng nhiều chức năng khác và các trường hợp có thể không luôn luôn cùng

Nếu không thể sửa đổi chức năng fillTree(), bạn có thể quấn nó theo chức năng của riêng bạn và áp dụng chức năng gọi lại cho chức năng đó. Hãy thử điều này:

function doStuff(callback) { 
    fillTree(); 

    // Call the callback parameter (checkSelectedBoxes() in this case) 
    // when fillTree() has completed 
    callback(); 
} 

doStuff(checkSelectedBoxes); 
+0

Câu trả lời của bạn đã giúp tôi với chức năng của tôi, nhưng câu trả lời cho câu hỏi của tôi đã được đưa ra bởi @joseph. Cảm ơn! –

0

Chức năng setTimeout không chờ thực hiện và bạn có thể kiểm tra rõ ràng trong đoạn mã sau. Bạn có thể xem như thế nào, với mảng waitTimes của thời gian ngẫu nhiên, chức năng Array.map sẽ in ra đầu tiên tất cả các giá trị time[index]=waitTimes[index], sau đó là wait[index]=waitTimes[index] khi số setTimeout được kích hoạt chính xác sau waitTimes[index] mili giây.

var console = { 
 
    log: function(s) { 
 
    document.getElementById("console").innerHTML += s + "<br/>" 
 
    } 
 
} 
 
var roundDecimals = function(num, pos) { 
 
    pos = pos || 4; 
 
    return (Math.round(num * Math.pow(10, pos))/Math.pow(10, pos)); 
 
} 
 
var arrayRangeMap = function(a, block) { 
 
    c = []; 
 
    while (a--) c[a] = block(); 
 
    return c 
 
}; 
 
var getRandomArbitrary = function(min, max) { 
 
    return (Math.random() * (max - min) + min); 
 
    } 
 
    // random 10 wait times, 3 decimal positions 
 
var waitTimes = arrayRangeMap(10, function() { 
 
    return roundDecimals(getRandomArbitrary(0.250, 0.5, 3) * 1000, 2); 
 
}); 
 

 
waitTimes.map(function(item, index) { 
 
    setTimeout(function() { 
 
    console.log("wait[" + index + "]=" + item); 
 
    }, item); 
 
    console.log("time[" + index + "]=" + item); 
 
});
<div id="console" />

0

Tôi chỉ cần thực hiện một thử nghiệm mà có thể quan tâm:

<!DOCTYPE html> 
<html> 
    <head> 
    <script> 

/* test: if returns in around 1000ms, must interrupt, otherwise it is indeed 
    not going to let timeout work until work is done. */  
window.onload = function() { 
    var before = performance.now(); 
    setTimeout(function() { 
     alert('completed in ~' + (performance.now() - before) + ' nanoseconds.'); 
    }, 1000); 

    /* count to 2^31 - 1... takes 8 seconds on my computer */ 
    for (var i = 0; i < 0xffffffff; ++i) { 
     /* me busy, leave me alone */ 
    } 
};  
    </script> 
    </head> 
    <body> 
    </body> 
</html> 

Tôi bây giờ thực sự tò mò cách hoạt Javascript biết khi nào số tiền nhất định của thời gian đã trôi qua. Liệu nó đẻ trứng một sợi chỉ ngủ trong một khoảng thời gian? Và nếu như vậy là có một giới hạn về bao nhiêu chủ đề ngủ, hoặc đang ngủ đề "lưu trữ" cho đến khi họ là cần thiết?Nhiều nhầm lẫn.

Tôi nghĩ rằng nó có cái gì để làm với

"Nếu nó không cần phải được chính xác 1s, sau đó chỉ cần usleep một giây. usleep và ngủ đặt tiểu trình hiện hành vào một trạng thái chờ đợi hiệu quả ít nhất là khoảng thời gian bạn đã yêu cầu (và sau đó nó trở thành đủ điều kiện để được lên lịch lại)

Nếu bạn không cố gắng đến gần thời gian chính xác thì không cần phải kiểm tra clock(). "

- pthread sleep function, cpu consumption

Vì vậy, tôi đoán hệ điều hành thực hiện lịch trình cho bạn, lúc này nó ngắt động cơ, và động cơ dừng lại trên thế giới và đặt các chức năng thời gian chờ trên đầu trang của hàng đợi để được thực thi càng sớm càng tốt?

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