这是我第三次编辑这篇文章,经过更多的测试和调试,我发现了新的问题。这是我的情况:
我有一个方法"thinker"需要花费一些时间进行处理。因此,我决定通过Ajax调用它,并向用户显示指示器。到这一步为止——效果很好。
另一件我正在尝试做的事情,就是实际上向用户显示"思考"的进度,以百分比或者只是刻度的形式。
这并不难做,因为"thinker"有一个循环,在每个迭代中,它将新的"thoughts"保存到数据库中。
所以基本上——"counter"只显示"thoughts"的数量(与特定id相关联)。
问题在于回调选项没有被调用。
好吧——划掉那个——它确实被调用了,但只有两次。在请求之前(显示为零)和在"thinker"完成思考时,当它不再有用时(显示完整数量)。
以下是简化的代码:
我有一个方法"thinker"需要花费一些时间进行处理。因此,我决定通过Ajax调用它,并向用户显示指示器。到这一步为止——效果很好。
另一件我正在尝试做的事情,就是实际上向用户显示"思考"的进度,以百分比或者只是刻度的形式。
这并不难做,因为"thinker"有一个循环,在每个迭代中,它将新的"thoughts"保存到数据库中。
所以基本上——"counter"只显示"thoughts"的数量(与特定id相关联)。
问题在于回调选项没有被调用。
好吧——划掉那个——它确实被调用了,但只有两次。在请求之前(显示为零)和在"thinker"完成思考时,当它不再有用时(显示完整数量)。
以下是简化的代码:
<span id="indicator" style="display: none;"><img src="/img/ajax-loader.gif" alt="" /></span>
<span id="progress"></span>
<span id="clicker" style="cursor: pointer;">Do it!</span>
<script type="text/javascript">
//<![CDATA[
Event.observe('clicker', 'click', function(event) {
new Ajax.Request(
'/examples/thinker/123',
{asynchronous:true, evalScripts:true, onComplete:function(request, json) {Element.hide('indicator');}, onLoading:function(request) {Element.show('indicator');}}
);
new Ajax.PeriodicalUpdater(
'progress',
'/examples/counter/123',
{asynchronous:true, evalScripts:true, frequency: 2}
);
});
//]]>
</script>
编辑:
通过使用Firebug XHR控制台,我成功地深入了解了这个问题。我试了试jQuery(只是为了测试,但它没有帮助)。
问题应该与CakePHP有关。我的意思是,当我使用基本的PHP创建了一个相同的场景时,它同时工作。当我使用Cake做时,counter
将被调用,然后thinker
将被调用,而counter
将在每两秒钟后被调用,但只会在thinker
思考结束后才会响应。
可能Cake无法在第一个请求完成之前处理第二个请求吗?
问候, Paul