2012-06-15 103 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