2012-11-30 27 views
3

我有一个循环(多个邮件调用)内的jQuery POST函数。
出于某种原因,jQuery正在发布,但没有返回所有数据,直到循环结束并一次解析所有结果。jQuery AJAX结果块不会立即触发

FOREACH arg_value IN args 
{ 
console.log('Do stuff'); 

    $.post('https://blah.com/xml.php', 
      {arg: arg_value}, 
      function(xml) { 
       $(xml).find('tag').each(function() { 
         console.log('Do more stuff'); 
       }); 
      }); 
} 

的这个输出是...

做的东西
做的东西
做的东西
不要更多的东西
做更多的东西
做更多的东西

看起来好像jQuery是cac直到最后才会执行结果。

我期待......

做的东西
不要更多的东西
做的东西
做更多的东西
做的东西
做更多的东西

有一个选项告诉jQuery暂停执行,直到有AJAX结果?它似乎像往常一样异步运行,但在这种情况下我不希望这样。

+4

我不认为任何东西都被缓存在这里。 AJAX是一个异步调用,只有当调用完成并发回结果时才会发生更多的事情。虽然你的每个是同步的并执行lineraly(在一个循环中) – ryadavilli

+0

将不会以这种方式运行...在AJAXsuccess返回时,这里其他代码得到执行..它异步调用.. – thecodejack

+1

这表现如预期。如果你想让你的ajax calles以连续的方式触发,请查看延迟来排序它们。 – Halcyon

回答

3

一个AJAX调用是异步的。这意味着你的回调:

function(xml) { 
    $(xml).find('tag').each(function() { 
     console.log('Do more stuff'); 
    }); 
} 

只有当服务器返回响应时才会执行。

同时,您的for-each循环将继续运行,并且记录Do stuff
除非你在你的循环做疯狂的事情,循环会比服务器响应
提到的一样快Jan Dvorak,即使你做疯狂的事情,在AJAX回调将等待循环来完成,从而导致Do stuff总是出现在任何AJAX响应之前。

+0

即使他做的很疯狂,服务器的响应也会等待循环结束。 –

+0

@JanDvorak:这是很好的知道,添加信息。 – Cerbrus

+0

给出了这个答案,因为这是第一个清晰而简洁的回答。感谢所有的帮助。 – PolishHurricane

0

你是异步这里,如果你想这样做可能是实现这一目标的最简单的方法是使用async.js

1

您的ajax调用是异步的,这意味着ajax调用被触发,然后继续执行其他代码的执行流程。它不会等待回应。当最终收到响应时,执行回调。

你可以做的是让你的ajax把所有的堆栈放在一个队列中,并且当收到每个响应时,引发队列中的下一个呼叫。这将实现你的死亡效果,从而下一个Ajax调用不会被发送,直到当前的调用完成。

如果你有很多的调用,这将比一旦需要时全部关闭它们慢得多,因为浏览器可以轻松地同时处理多个ajax调用。

1

$。员额()是异步调用...不会在工作循环的方式üwant..To得到üwant..here是解决方案的方式..

var i=0; 
callbackfunc(i) { 
console.log('Do stuff'); 
$.post('https://blah.com/xml.php', 
     {arg: args[i]}, 
     function(xml) { 
      $(xml).find('tag').each(function() { 
       //something related to xml data 
      }); 
      console.log('Do more stuff'); 
       i++; 
       if(i<args.length)callbackfunc(i) 
      } 
     }); 
} 

照顾变量..可能会在这里创建闭包...

+0

上午通过我参数... – thecodejack

+0

它会更容易通过'i + 1'作为参数;-) –

+0

嗯...我可以做更多的事情:P .. but thght让它保持简单.. – thecodejack