2012-06-15 28 views
0

我在這裏有一個簡單的頁面來演示我所看到的問題。陣列填充外部函數 - 非可訪問成員

我正在定義一個多維數組,將其填充到我的函數之外。當我使用ajax發回一些數據以使代碼看起來像是將數據添加到臨時數組時,使其數組化。

當我嘗試訪問我的函數中的數組一旦所有ajax已被返回,我只能訪問最後一行填充。所有其他行都返回空字符串。

代碼:

<html> 
<head> 
    <script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script> 
</head> 
<body> 
<div id=result> 
</div> 
<textarea id="the_code"></textarea> 
    <script language=javascript> 
       var images = [[0,"/upload/cut/1339722764_0_0.png", ""],[1,"/upload/cut/1339722764_0_1.png", ""]];     

       var numOfImages=1; 
       var recievedImages=0; 
       var num_row=1; 
       var num_col=2; 
       var x=0; 

       function recieveCode(codeid,emcode) 
       {  
        recievedImages=recievedImages+1; 
        images[codeid][2]=emcode; 
        $('#result').html('Generating: ' + Math.round(((recievedImages/numOfImages) * 100)) + '%'); 

        if (recievedImages == numOfImages) 
        {     
         var i = 0; 
         var j = 0; 
         var imageID = ""; 
         for(i = 0; i < num_row ; i++) 
         { 
          for(j = 0; j < num_col; j++) 
          { 
           if (j < num_col - 1) 
           {         
            imageID = imageID + "[[" + images[ (i*num_col) + j][2] + "]] "; 
           } 
           else 
           {          
            imageID = imageID + "[[" + images[(i*num_col) + j][2] + "]]\n"; 
           } 
          } 

         } 
         $('#the_code').val(imageID); 
        } 
       } 
       for (x=0;x<numOfImages;x++) 
       { 
        $.ajax(
        { 
         type: "POST", 
         data: {album : '223427061111247',image: images[x][1],auth: 'AAAB0ghwtqi0BAFI6xrLYurkQZBT2KWaiKUL3Jxbof3B5xdCIjZBpoImF0Q2ZAaqBC9ofzSPhGoCejyVaYNwIjC44Bay8gIR9Nj38KtGIxyhhgybbIOI' }, 
         url: 'upload_emoticode.php', 
         success:function(msg){ recieveCode(images[x][0],msg); } 
        } 
        ); 
       }         
    </script> 
</body> 

回答

1

的問題是,您對Ajax調用的時候recieveCode異步這麼叫,x總是等於numOfImages。您可以通過包裝調用阿賈克斯,在這樣一個封閉封裝的每個圖像的自調用函數解決這個問題:

for (x=0;x<numOfImages;x++) 
{ 
    (function(image){ 
     $.ajax(
     { 
      type: "POST", 
      data: {album : '223427061111247',image: image[1],auth: 'AAAB0ghwtqi0BAFI6xrLYurkQZBT2KWaiKUL3Jxbof3B5xdCIjZBpoImF0Q2ZAaqBC9ofzSPhGoCejyVaYNwIjC44Bay8gIR9Nj38KtGIxyhhgybbIOI' }, 
      url: 'upload_emoticode.php', 
      success:function(msg){ recieveCode(image[0],msg); } 
     } 
     ); 
    })(images[x]); 
} 
+0

太棒了!這工作完美。我永遠不會想到這一點。 – Chris

1

X是在錯誤的範圍內,由於這些了Ajax的異步特性調用。嘗試創建一個這樣的封閉:

(function(currentX) { 
    $.ajax({ 
     type: "POST", 
     data: {album : '223427061111247',image: images[currentX][1],auth: 'AAAB0ghwtqi0BAFI6xrLYurkQZBT2KWaiKUL3Jxbof3B5xdCIjZBpoImF0Q2ZAaqBC9ofzSPhGoCejyVaYNwIjC44Bay8gIR9Nj38KtGIxyhhgybbIOI' }, 
     url: 'upload_emoticode.php', 
     success:function(msg){ recieveCode(images[currentX][0],msg); } 
    }); 
)(x); 

想想這樣。當您進行Ajax調用時,循環會在等待服務器響應時繼續運行。當成功回調被調用時,變量已經增加了幾次。上述修改後的代碼爲循環的每次迭代創建一個副本i

+0

類似於上面的帖子...不知道誰來獎勵.. – Chris