2012-10-22 78 views
1

好的,我使用jQuery製作了一個do-while循環。基本上它的重點是檢查目錄中是否有照片並將其添加到數組中。該目錄的照片全部命名爲「phone01.png」,「phone02.png」等,並且它們位於名爲「幻燈片」的目錄中。即使在while爲真的情況下,Javascript仍會繼續循環,但不會繼續執行

下面的代碼:

var images = []; 
var i=0; 

    do { 
     ++i; 
     $.get('./slides/phone0' + i + '.png',function(){ 
      images[(i-1)] = './slides/phone0' + i + '.png'; 
     }); 
    } 
    while (images[(i-1)] == './slides/phone0' + i + '.png'); 

所以,如果我在最後使用控制檯,圖像[]只包含 './slides/phone01.png',但

我是1

圖像[第(i-1)]因此, './slides/phone0' + I +'」 png格式

輸入(images[(i-1)] == './slides/phone0' + i + '.png')返回true。所以while語句是真實的,但循環不會繼續。此外,如果我再次手動運行循環(迭代我,運行獲取)get將成功,並添加一個新成員到數組。所以, do函數從來沒有第二次運行

什麼給?

+0

將永遠只能是有<10頁的圖片? (<9,除非你以'phone00.png'開頭。) –

+0

對我來說看起來像是DDOS攻擊O_o – jAndy

+0

'$ .get'需要時間從服務器下載文件,'do'不會等待它完成... – DCoder

回答

3

$ .get是一個異步請求。所以你的循環將永遠運行一次,因爲圖像數組永遠不會像你期望的那樣被設置。

1

這是一個經典的異步問題。

當您撥打$.get()時,它不會立即進入您提供的功能。

會發生什麼,它會建立一個HTTP請求,並將該函數附加到請求中,作爲請求成功時調用的函數。

程序的原始部分繼續進行自己的業務,忘記了HTTP請求和它傳遞給它的函數。

在這種情況下,程序的原始部分是while循環。一旦它被賦予了它的功能,它將繼續並循環while循環。

被在循環的每次迭代中創建的功能不會被觸發,直到(a)所述HTTP請求具有一個成功的響應,和(b)在運行停止阻塞線程,並賦予它的Javascript代碼的其餘部分一個運行的機會。

這被稱爲異步代碼,並且是第一個'A'術語'AJAX'。這也是整個Javascript的事件處理模型的工作原理,以及您在jQuery中看到的所有嵌套函數。 (這也可以解釋其他情況,您可能已經看到代碼似乎以錯誤的順序運行)。

如果你想用異步代碼做這樣的循環,你需要寫得非常不同:傳統的while循環就像你寫的那樣循環不起作用。

有很多事情要做,但不僅僅是給你一些代碼,我建議你多鑽研一下這個事情是如何工作的,因爲如果你要編寫Ajax代碼,你需要了解這個東西。

雖然我會給你一個提示:全局變量在這類程序中通常並不是那麼有用。從你的代碼示例中不清楚你的變量是否是全局變量,但是如果它們是變量,你肯定會考慮將它們變成局部變量並在函數之間傳遞它們,而不僅僅是期望將它們設置在一個地方,對於它們在另一個工作。

希望有所幫助。

+0

嘿斯普德利,我真的很喜歡你的解釋,我很高興你沒有完全放棄。 – DudeGuy

+0

@all我還在工作......我會讓你們知道,當我有一些事實上是一種改善。我的想法是使用Xzibit函數(函數中的一個函數),然後使用另一個函數播放圖像。再次感謝你的幫助。 – DudeGuy

1

那麼首先,其表達如何立即調用的函數工作仍然脆弱的把握,我嘗試這樣做:

var i=0; 

do { 
    ++i; 
    (function(iteration){ 
     $.get('./slides/phone0' + i + '.png',function(){ 
      images[(i-1)] = './slides/phone0' + i + '.png'; 
     }); 
    })(i); 
} 
while (images[(i-1)] == './slides/phone0' + i + '.png'); 

試圖迫使while循環內的GET的評價......沒有無濟於事。我已經解決了以下問題。任何想法如何有效/清潔這是值得歡迎的。我可能會從C的角度思考太多(函數中的函數! - 在這裏插入Xzibit meme)。但是,這並完成這項工作:

var i=0; 

function createArray(){ 
    $.get('./slides/text0' + (i+1) + '.txt',function(data){ 
     texts.push(data); 
    }); 
    $.get('./slides/phone0' + (i+1) + '.png',function(){ 
     images[i] = new Image(); 
     images[i].src = './slides/phone0' + (i+1) + '.png'; 
     i++; 
     createArray(); 
    }).error(function(){ 
     slider(); 
    }); 
}