我想知道使用$ .ajax(jquery)方法调用Web服务的最佳方法是什么,考虑到我需要多次调用该Web服务并且每次都传递不同的参数它。 到目前为止我尝试过的:
任何其他想法都将受到欢迎。提前谢谢!
编辑1:
答案 0 :(得分:1)
有两种基本方法可以做到这一点:
使用promises将多个ajax调用链接在一起。链接过程将强制顺序操作,因此一个完成,然后下一个启动。
在ajax调用的成功处理程序中,启动下一个ajax调用(第三个选项)。
如果不同的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