我並不完全清楚你問什麼,但我認爲JavaScript不工作,你想的那麼它不能做的方式。例如,不能完成常規函數調用,直到操作完成或一段時間(以先到者爲準)。這可以在javascript之外實現,並通過javascript公開(如同步ajax調用一樣),但不能用純JavaScript和常規函數完成。
不像其他的語言,JavaScript是單線程的,這樣同時函數執行定時器將不會執行(除網絡工作者,但他們都非常,在他們能做什麼非常有限)。定時器只能在函數執行完成時執行。因此,甚至不能在同步函數和定時器之間共享進度變量,因此計時器無法「檢查」函數的進度。
如果你的代碼是完全獨立的(沒有訪問任何你的全局變量,沒打電話給你的其他功能,反正沒有訪問DOM),那麼你可以在Web的運行worker(僅在較新的瀏覽器中可用)並在主線程中使用計時器。當網絡工作者代碼完成時,它會將結果發送給主線程。當主線程收到該消息時,它停止定時器。如果計時器在收到結果之前觸發,它可能會殺死網絡工作者。但是,你的代碼必須忍受網絡工作者的限制。
Soemthing也可以用異步操作就像這樣(因爲他們與JavaScript的單線程岬更好的工作):
- 啓動異步操作像Ajax調用或圖像的加載。
- 使用
setTimeout()
您的超時時間開始計時。
- 如果你的異步操作之前,定時器觸發完成,然後停止異步操作(使用API來取消它)。
- 如果異步操作計時器觸發之前完成,則取消定時器
clearTimeout()
並繼續。
例如,這裏是如何把一個超時上的圖像的加載:
function loadImage(url, maxTime, data, fnSuccess, fnFail) {
var img = new Image();
var timer = setTimeout(function() {
timer = null;
fnFail(data, url);
}, maxTime);
img.onLoad = function() {
if (timer) {
clearTimeout(timer);
fnSuccess(data, img);
}
}
img.onAbort = img.onError = function() {
clearTimeout(timer);
fnFail(data, url);
}
img.src = url;
}
['window.setTimeout(function_here,number_timeout_milliseconds)'](https://developer.mozilla.org/en/DOM/window.setTimeout)或'window.setInterval'? – 2012-01-08 15:29:24
它不能完成,該功能將不會返回到任何東西,直到它完成。 – Esailija 2012-01-08 15:33:07