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.
});