Javascript jqueryajax等待每个函数 $xy('#simpan')。单击(函数(){ $xy('input[id=“cekbok[]”:checked')。每个(函数(){ var data=(this.value); var div=(this.value); var str=window.location.href; var res=str.replace(“wp admin/options general.php?page=katalogu options”,“/wp content/plugins/katalog/includes/img/loading.gif”); var加载=(“”); $xy.ajax({ 键入:“POST”, url:“../wp content/plugins/katalogunique/proses2.php”, 数据:{ id:(this.value) }, 成功:功能(数据){ $xy('#结果'+div).empty(); $xy(“#结果”+div).append(数据); $xy('#tz'+div).remove(); } }); }); });
我的函数在循环中将复选框值发送到Javascript jqueryajax等待每个函数 $xy('#simpan')。单击(函数(){ $xy('input[id=“cekbok[]”:checked')。每个(函数(){ var data=(this.value); var div=(this.value); var str=window.location.href; var res=str.replace(“wp admin/options general.php?page=katalogu options”,“/wp content/plugins/katalog/includes/img/loading.gif”); var加载=(“”); $xy.ajax({ 键入:“POST”, url:“../wp content/plugins/katalogunique/proses2.php”, 数据:{ id:(this.value) }, 成功:功能(数据){ $xy('#结果'+div).empty(); $xy(“#结果”+div).append(数据); $xy('#tz'+div).remove(); } }); }); });,javascript,jquery,ajax,promise,jquery-deferred,Javascript,Jquery,Ajax,Promise,Jquery Deferred,我的函数在循环中将复选框值发送到proses2.php,但当我运行此脚本时,它将同时运行所有ajax POST调用。我想逐个运行ajax请求或等到完成,我如何解决这个问题?您可以使用这样的递归函数来逐个执行所有调用: $xy('#simpan').click(function() { $xy('input[id="cekbok[]"]:checked').each(function() { var data = (this.value); var div = (this.
proses2.php
,但当我运行此脚本时,它将同时运行所有ajax POST调用。我想逐个运行ajax请求或等到完成,我如何解决这个问题?您可以使用这样的递归函数来逐个执行所有调用:
$xy('#simpan').click(function() {
$xy('input[id="cekbok[]"]:checked').each(function() {
var data = (this.value);
var div = (this.value);
var str = window.location.href;
var res = str.replace("wp-admin/options-general.php?page=katalogu-options", "/wp-content/plugins/katalog/includes/img/loading.gif");
var loading = ('<img src="'+res+'">') ;
$xy.ajax({
type : 'POST',
url : '../wp-content/plugins/katalogunique/proses2.php',
data: {
id : (this.value)
},
success:function (data) {
$xy('#result'+div).empty();
$xy('#result'+div).append(data);
$xy('#tz'+div).remove();
}
});
});
});
$xy('#simpan')。单击(函数(){
var str=window.location.href;
var i=0;things=$xy('input[id=“cekbok[]”:checked');
(doOneTask()函数){
如果(i++>=things.length)返回;
var thing=事物[i];
var数据=thing.value;
var div=thing.value;
var res=str.replace(“wp admin/options general.php?page=katalogu options”,“/wp content/plugins/katalog/includes/img/loading.gif”);
var加载=(“”);
$xy.ajax({
键入:“POST”,
url:“../wp content/plugins/katalogunique/proses2.php”,
数据:{
id:东西,价值
},
成功:功能(数据){
$xy('#结果'+div).empty();
$xy(“#结果”+div).append(数据);
$xy('#tz'+div).remove();
}
}).始终(doOneTask);
})();
});
注意:如果您想在第一次失败时停止,而不是像我一样执行下一次调用,请将
始终
替换为完成
一种方法是使用递归函数,每次都将列表(减去第一个条目)传递回
e、 g.调用代码简化为:
$xy('#simpan').click(function() {
var str = window.location.href;
var i=0; things = $xy('input[id="cekbok[]"]:checked');
(function doOneTask(){
if (i++>=things.length) return;
var thing = things[i];
var data = thing.value;
var div = thing.value;
var res = str.replace("wp-admin/options-general.php?page=katalogu-options", "/wp-content/plugins/katalog/includes/img/loading.gif");
var loading = ('<img src="'+res+'">') ;
$xy.ajax({
type : 'POST',
url : '../wp-content/plugins/katalogunique/proses2.php',
data: {
id : thing.value
},
success:function (data) {
$xy('#result'+div).empty();
$xy('#result'+div).append(data);
$xy('#tz'+div).remove();
}
}).always(doOneTask);
})();
});
LoadAjax是递归的,如下所示:
$xy('#simpan').click(function() {
LoadAjax($xy('input[id="cekbok[]"]:checked'));
});
函数加载Ajax(元素){
//完成后退出
如果(!elements.length)返回;
var$this=elements.first();
var数据=($this.value);
var div=($this.value);
var str=window.location.href;
var res=str.replace(“wp admin/options general.php?page=katalogu options”,“/wp content/plugins/katalog/includes/img/loading.gif”);
var加载=(“”);
$xy.ajax({
键入:“POST”,
url:“../wp content/plugins/katalogunique/proses2.php”,
数据:{
id:($this.value)
},
成功:功能(数据){
$xy('#结果'+div).empty();
$xy(“#结果”+div).append(数据);
$xy('#tz'+div).remove();
//与列表的其余部分一起递归
LoadAjax(elements.slice(1));
}
});
}
这里有一种方法没有递归,而是使用一个简单的循环:
function LoadAjax(elements) {
// Exit when done
if (!elements.length) return;
var $this = elements.first();
var data = ($this.value);
var div = ($this.value);
var str = window.location.href;
var res = str.replace("wp-admin/options-general.php?page=katalogu-options", "/wp-content/plugins/katalog/includes/img/loading.gif");
var loading = ('<img src="' + res + '">');
$xy.ajax({
type: 'POST',
url: '../wp-content/plugins/katalogunique/proses2.php',
data: {
id: ($this.value)
},
success: function (data) {
$xy('#result' + div).empty();
$xy('#result' + div).append(data);
$xy('#tz' + div).remove();
// Go recursive with the rest of the list
LoadAjax(elements.slice(1));
}
});
}
注意,我可以用来“巧妙地解决这个问题”。减少将行数从6行缩短到4行,但老实说,我宁愿让循环构造OP感到舒适。这是因为承诺链接——基本上,当您从返回一个操作时,它将等待该操作,然后再执行下一个,然后将其链接到
让我们举例说明:
functionlog(msg){//记录东西的简单函数
document.body.innerHTML+=msg+“
”;
}
var delay=function(ms){//这是一个异步请求,模拟AJAX
var d=$.Deferred();
setTimeout(d.resolve,ms);//解析延迟使其then处理程序执行
返回d;
};
//$.Deferred.resolve()启动一个新链,以便处理程序执行
var p=$.Deferred().resolve().then(函数(){
日志(“1”);
返回延迟(1000);//就像在代码中一样,我们在链接时等待它
}).then(function(){//在上面的代码中,这是d=d.then部分,
log(“2”);//此操作仅在上述延迟完成时运行
返回延迟(1000);
});
//更像上面的例子,我们可以用一个循环来链接它:
[3,4,5,6,7,8,9,10].forEach(函数(i){
p=p.then(函数(){
日志(i);
返回延迟(1000);
});
});代码>
你说它将运行所有ajax POST是什么意思?请再解释一下。而且,查看$xy('input[id=“cekbok[]”):checked')
您似乎有多个复选框
具有相同的id
,这是错误的,因为id
在任何给定文档中都必须是唯一的!发布你的HTML
。如果我选中10个复选框,那么它将运行10个Ajax Post到proses2.php,是的,复选框ID是唯一的,这个脚本已经工作了,但我想让它一个接一个地运行。。。谢天谢地,你想实现什么是不是var data=thing.value代码>?很明显,这是重复的。@LShetty是的,忘记了这个改变,很早就完成了,但是在递归函数外部初始化变量,在递归函数内部使用,这是错误的。当然,传递一个简化的列表可以让它保持独立,没有外部依赖或初始化?另外,您仍然在函数中引用这个,这是不正确的。@TrueBlueAussie如果要在一个地方使用它,我更喜欢使用闭包而不是传递参数。但是没有太大的区别。很公平:你又错过了一个<代码>这个代码>承诺的忠实粉丝,太酷了。最好更详细地解释一下这一点,因为它会把所有人都搞糊涂,除了那些顽固分子:)我同意这是最干净的solution@TrueBlueAussie谢谢,我加了一些词来解释。我将添加一个简单的示例。@TrueBlueAussie我添加了一个考试
$xy('#simpan').click(function() {
var url = '../wp-content/plugins/katalogunique/proses2.php';
var d = $.Deferred().resolve(); // empty promise
$xy('input[id="cekbok[]"]:checked').each(function() {
var div = this.value;
d = d.then(function(data){
$xy('#result'+div).empty().append(data);
$xy('#tz'+div).remove();
return $xy.post(url, {id: div}); // this will make the next request wait
});
});
// can d.then here for knowing when all of the requests are done.
});