2011-10-09 58 views
0

我試圖做一個遞歸函數來使用jQuery和ajax刪除文件來顯示進程的狀態。問題是,第一次執行函數(索引0)時,一切正常,「輸出」爲「1594.jpg」。但是,當索引增加到1時,它是鏈filesToDelete的第二個字符,'5',然後是'9',依此類推。使用數組的遞歸JavaScript函數不起作用

filesToDelete = new Array(); 
filesToDelete = '1594.jpg,my.png,test.ogg,Song.mp3,Apple_4S.mov,An App.exe'; 
filesToDelete = filesToDelete.split(','); 

function ajaxDelete(itemList, cpt) { 
    var tempItemList = itemList; 

    //If cpt is not initialized, initialize it, make sure it's an integer 
    if(isNaN(cpt)) cpt = 0*1; 

    //If cpt is equal to the array, exit 
    if(cpt >= itemList.length) return; 

    //Current index 
    var curIndex = cpt; 
    //The value of the current index 
    var current = itemList[curIndex]; 
    //DEBUG 
    console.log('cpt:'+cpt+' index:'+curIndex+' Value:'+itemList[curIndex]); 

    $.ajax({ 
     url: "deleteFile.php?id="+current, 
     beforeSend: function(){ 
      progressText('Suppression de '+current); 
     }, 
     success: function(data){ 
      progressText('Suppression...'); 
      //Index + 1 
      cpt++; 
      //RECURTION 
      setTimeout("ajaxDelete('"+itemList+"', "+cpt+")",1); 
     } 
    }); 
} 

任何幫助表示歡迎,並提供瞭解釋如果可能的話..

謝謝!

+0

你是如何調用'ajaxDelete()'和'filesToDelete'? –

+2

直接在服務器上完成這樣做會不會更好? – deceze

+0

@deceze:不,因爲我想爲用戶和事件提供反饋,如果我在php中使用flush(*),AJAX仍然等待完整頁面被加載,然後返回結果。 –

回答

1

不要依賴ajax成功的方法,如果它因任何原因而停滯不前,你就會陷入困境。

您應該爲每個文件執行ajax調用以刪除或更好地發送文件數組到服務器並讓它處理它。

for (i = 0; i <= filesToDelete.length; i++) 
{ 
    // Ajax Call 
    $.ajax({ 

    }); 
} 
+0

哦,該死的,從來沒有想過,非常感謝你,馬上嘗試! –

+0

像魅力一樣工作! Thx男人!編輯:是否有可能在跳到其他索引之前等待來自ajax請求的答案? –

+1

很高興我能幫到你。 –

1

您以字符串形式傳遞itemList,但相信它是一個數組。 (在我的意思是setTimeout)。

但我同意評論/回答; EW!

+0

如何將它作爲數組粘貼? (只是爲了學習,我會帶着Miste Jeremy的解決方案:)) –

1

你的setTimeout調用執行字符串命令:

setTimeout("ajaxDelete('"+itemList+"', "+cpt+")",1); 

連接字符串時和對象,它需要的toString該對象的值()。在數組的情況下,會給你這個:

ajaxDelete('1594.jpg,my.png,test.ogg,Song.mp3,Apple_4S.mov,An App.exe', 1) 

而字符串將接受括號並給你那個字符。這會給你「5」

'1594.jpg,my.png,test.ogg,Song.mp3,Apple_4S.mov,An App.exe'[1] 

你可以省略該參數,並直接在您的通話使用filesToDelete ...

+0

感謝Jason fot的解釋,現在你已經向我解釋過了,我覺得XD很愚蠢......下次我會更加小心,謝謝 –

+0

沒有抱歉Jason仍然從FireBug獲取錯誤:setTimeout(「ajaxDelete(」+ filesToDelete +「,」+ cpt +「)」,1); –

+0

我的意思是甚至不把itemList作爲參數,聲明你的函數「ajaxDelete(cpt)」,你可以使用現有的filesToDelete數組。由於您只需在函數外設置值,它應該位於窗口對象上。 –