在for循环中从ajax(jquery)调用web服务

时间:2014-06-10 23:46:48

标签: jquery ajax web-services

我想知道使用$ .ajax(jquery)方法调用Web服务的最佳方法是什么,考虑到我需要多次调用该Web服务并且每次都传递不同的参数它。 到目前为止我尝试过的:

  1. 将ajax调用包含在 for 循环中,但当然也是如此 不起作用(一个ajax调用在实例化之前没有正确结束 下一个 - 那是我记得第一个'a'的时候 ajax代表 异步 )。
  2. 使用$ .each方法(类似 结果如上)。
  3. 我考虑过调用Web服务 递归地在ajax调用的成功回调选项中传递 每个循环中有一个参数。因为我不在,所以还没有达到这个目标 我现在的工作电脑,但我想知道是否有 一种更优雅,更快捷的解决问题的方法。
  4. 任何其他想法都将受到欢迎。提前谢谢!

    编辑1:

    • 仅供参考,Web服务用于将数据插入MS SQL DB。
    • 参数的数量可能会有所不同(我的意思是它不是固定的数字)。

1 个答案:

答案 0 :(得分:1)

有两种基本方法可以做到这一点:

  1. 使用promises将多个ajax调用链接在一起。链接过程将强制顺序操作,因此一个完成,然后下一个启动。

  2. 在ajax调用的成功处理程序中,启动下一个ajax调用(第三个选项)。

  3. 如果不同的ajax调用实际上并不相互依赖,您也可以并行启动它们,然后仅对结果进行序列化。这导致端到端时间快得多。

    或者,正如其他人所建议的那样,如果您可以修改您的Web服务以便在一次ajax调用中传递多个请求,那么您可以通过一次ajax调用请求所有数据,服务器将立即返回所有数据


    对于第一个选项,这是使用promises序列化ajax调用的示例:

    Sequential function calls in javascript

    // serialize all requests
    function A() {
        var p = $.get(url).then(function(data) {return $.post(url)});
        for (var i = 1; i < 5; i++) {
            // chain four more pairs of requests onto the original promise
            p = p.then(function() {return $.get(url)})
                 .then(function(data) {return $.post(url)});
        }
        // return the promise so callers can monitor when A() is done
        return p;
    }
    
    
    function B() {
        // sequence these three operations one after the other
        return ($.get(url)
           .then(function(data) {return $.post(url + x)})
           .then(update_dropdown)
        );
    }
    
    // run them both, one after the other
    A().then(B);
    

    对于第二个选项,您无法使用for循环,因为(正如您已经想到的那样,它只会立即启动所有ajax调用)。相反,您重新构建循环,以便从成功处理程序启动下一个迭代。以下是我所处理的其他代码中第二个选项的示例:

    (function() {
    
        var checked = $('.check_box_ping:checked');
        var index = 0;
    
        function next() {
            if (index < checked.length ) {
                var item = checked.eq(index++);
                // use item here for your post
                $.post({...}, function(response) {
                    // do your normal handling of the response here
                    ...
                    // now kick off the next iteration of the loop
                    next();
                });
            }
        }
        next();
    
    })();
    

    以下是其他一些例子:

    behavior of ajax call inside a for loop

    Wait for AJAX to finish before proceeding with the loop?

    While loop with jQuery async AJAX calls