0

我在 jquery 的按钮单击事件中有一些代码。它获取 aspx 页面中的所有单选按钮,并根据它们的单击状态循环遍历它们,并使用 ajax 调用(到 c# 中的一个函数,该函数确实将其再次传递给 web 服务)一个接一个地保存它们。

现在我想在保存事件后调用页面刷新功能。但是,当我调用该事件时,页面会在所有保存发生之前刷新,并且只有少数单击的按钮处于新的选中状态,而其他按钮仍根据其旧状态加载。

那么我该如何等到所有保存完成并调用刷新功能...我尝试了 jquery when 和 trigger 以及其他一些方法,但似乎没有任何效果..

 $('#btnsubmit').click(function() { 
        $('.radioControl:radio:checked').each(function(e, i) {  
            .............      
           commentsAjax.doAjax(...);  //function 
        });   
       refresh();
    });  
 commentsAjax = { 
    doAjax: function(....) { 
        ................
        some function call in C# code which from then goes to a web service  
        success: function(e) {
            //alert('Saved Successfully');         
        }
    }; 
4

1 回答 1

1

您将不得不使用递归的概念,或者基本上带有回调的循环。

(function recur(elements) {
    var elem = Array.prototype.shift.call(elements);

    if(elem) {
        $.ajax({
            url: "/path/to/check",
            success: function() {
                recur(elements); //Success, go again
            }
        });
    } else {
        //Done!
        refresh();
    }
})($(".radioControl:radio:checked"));

这里发生的是我们首先创建我们的recur函数。您可能熟悉 IIFE(立即调用函数表达式)模式,我们创建一个匿名函数并立即调用它(function(){})()(在循环。接下来,我们发送一个元素数组,随着循环的缓慢进行,我们将第一项移出数组并将新的移位数组发送到下一次迭代。这会耗尽数组,直到没有元素,即完成!

我们使用的原因Array.prototype.shift.call是因为 jQuery 对象不是原生数组,但具有所有必要的元素以允许我们在shift其上调用原生函数(这些元素length以及在索引处访问对象的能力)。

于 2013-09-02T17:46:11.243 回答