我正在制作一个wordpress插件,我有一个函数,我导入图像,这是通过$ .each() - 循环调用.load() - 函数每次迭代。 load-function调用的load-function页面正在下载图像并返回一个数字。该数字将导入span-element。源和目标阵列是从隐藏的UL的LI-elemnts导入的。
通过这种方式,用户可以看到计数器从零开始计数到导入的图像总数。您可以在下面查看我的jQuery代码:jQuery(document).ready(function($) {
$('#mrc_imp_img').click(function(){
var dstA = [];
var srcA = [];
$("#mrc_dst li").each(function() { dstA.push($(this).text()) });
$("#mrc_src li").each(function() { srcA.push($(this).text()) });
$.each(srcA, function (i,v) {
$('#mrc_imgimport span.fc').load('/wp-content/plugins/myplugin/imp.php?num='+i+'&dst='+dstA[i]+'&src='+srcA[i]);
});
});
});
这非常好用,但有时看起来加载功能并没有像它应该那样快地更新DOM,因为有时候更新的数字比前一个更低,几乎每次更低的数字都会替换最后的数字到底。我怎样才能防止这种情况发生?如果$ .each-loop准备就绪,我如何让它隐藏'#mrc_imp_img'?
答案 0 :(得分:1)
之前调用的AJAX调用不能保证提前完成,因此较小的数字可以覆盖较大的数字。一种解决方案是在每次成功呼叫时简单地递增计数器:
jQuery(function($) {
$('#mrc_imp_img').click(function(){
var dstList = $("#mrc_dst li");
var srcList = $("#mrc_src li");
dstList.each(function(i) {
var dst = $(this).text();
var src = srcList[i].text();
$.post('/wp-content/plugins/myplugin/imp.php?num='+i+'&dst='+dst+'&src='+src, function() {
$('#mrc_imgimport span.fc').text($('#mrc_imgimport span.fc').text()+1);
});
});
});
});
(更改代码以避免不必要的数组操作,更改onready调用以使用速记,更改AJAX调用以使用POST,这应该用于更改状态的操作。)
答案 1 :(得分:0)
大多数服务器可能运行有限数量的线程。如果你一次关闭10个电话,而你的服务器只有5个线程,其中5个将失败。
此外 - 一旦你最大化了所有正在运行的线程,没有其他用户可以访问服务器,所以你基本上是在服务器上。
如果您不介意一次将其减慢到一个呼叫,请执行Tgr推荐的哪些序列化呼叫,等待每个呼叫完成后再启动下一个呼叫。
我更喜欢尤达的建议。您可以做的是将其转换为一个处理整个阵列的服务器调用。如果你真的想要更新计数器客户端,那么一个服务器调用可以更新数据库中的计数器 - 然后第二个ajax调用可以每隔几秒轮询服务器以找出计数器的位置。显然不能保证顺序但对您的服务器健康状况会更好。你也可以伪造顺序方面(如果你在#3上,下一个调用产生#6 - 逐个增加它的客户端)
就没有看到警报而言,警报线之前或之上可能存在javascript错误。尝试使用firebug和console.log语句,或者甚至更好地使用firebug调试器逐步执行它。