2009-11-02 77 views
1

我知道,在編寫擴展時,除了使用setTimeout調用外,沒有辦法延遲函數調用,但這是我試圖在插件中實現的功能正在開發用於Firefox(這是不適合的方式嵌入到網頁中的JavaScript):Firefox插件中的Javascript:延遲for循環

爲(VAR I = 0;我< t.length;我++){

//Load a URL from an array 
//On document complete, get some data 

}

這個想法很簡單。我有一組我需要解析和提取一些數據的URL。這些URL中的每一個都需要一些時間來加載。因此,如果我嘗試從當前頁面獲取一些數據而不等待頁面加載,則會出現錯誤。現在,爲了做到這一點,因爲我知道的唯一方法如下:

了firstFunction:函數(){

//Load the first url 
    setTimeout("secondfunction", 5000); 

}

secondfunction:函數(){

//Load the second url 
setTimeout("thirdfunction", 5000); 

}

等等......我知道,這顯然是錯誤的。我只是想知道人們是如何在JavaScript實現這個...

編輯:對不起不是更詳細...

+1

請添加一些更多的信息 - 也許我錯過了它,但我不明白你想要做什麼或問題是什麼。 –

+1

你可以隱藏這個異步。編程風格更多,但這就是它。 – 2009-11-02 02:35:33

+0

你在混淆你的問題。看起來你要求比setTimeouts更好的編寫代碼的方式(這樣你的邏輯就不會分散在多個函數中)。然後在對回覆的評論中說明你不想使用setTimeout的原因是因爲它不正確。如果是這種情況,請參閱James的回答 - 您應該使用適當的回調(不是基於時間的,而是基於事件的)。 – Nickolay

回答

1

我米不相信這種類型的foolery是必要的,但我不是一個擴展dev,所以誰知道。如果這是你想要的方式,然後纔有setTimeout調用指的是相同的功能:

var index; 
firstfunction: function() { 
    // do something with `index` and increment it when you're done 

    // check again in a few seconds (`index` is persisted between calls to this) 
    setTimeout("firstfunction", 5000); 
} 
+0

謝謝你的...只是我正在尋找一些不使用setTimeout的方法,這是一個非常危險的函數。例如,如果頁面加載時間超過5秒,代碼將中斷... – Legend

+0

您可以多次調用它。我認爲你的直覺是這種做法是錯誤的,但是,我對這個領域的瞭解不多 - 對不起! –

1

我不知道如何從一個插件做到這一點,但我已經在過去借助iframe做將回調附加到目標文檔的onLoad事件。

也許是這樣的:

var index = 0; 
var urls = [ ..... ]; 
function ProcessDocument() { ....; LoadNextDocument(); } 
function LoadNextDocument() { index++; /* Load urls[index] */; } 
document.body.onLoad = ProcessDocument; 

某處存在,你就需要測試指標> urls.length也爲您的最終條件。

0

我有同樣的問題,但我用遞歸而不是循環。 以下是運行代碼,它通過循環列表來更改元素的innerHTML。希望它有幫助。

<Script type="text/javascript"> 
var l; 
var a; 
function call2() 
{ 
    l = document.getElementById('listhere').innerHTML; 
    a = l.split(","); 
    call1(0); 
} 

function call1(counter) 
{ 
    if(a.length > counter) 
    { 
     document.getElementById('here').innerHTML = a[counter]; 
     counter++; 
     setTimeout("call1("+counter+")",2000); 
    } 
} 

</Script> 

    <body onload="call2()"> 
    <span id="listhere">3,5,2,8</span><Br /> 
    <span id="here">here</span>