同步发出多个 ajax 请求
Making multiple ajax requests synchronously
假设我有一些名为 makeRequest()
的函数,它向服务器发出 AJAX 请求。
现在假设我知道应该发出此请求的次数,但我不能异步执行,而是同步执行。
比如给我5号,我叫makeRequest()
,打完再打,打完再打……我应该最后调用它 5 次。
我不是 JavaScript 方面的专家,但我发现使用回调处理异步调用很容易。
因此,我的 makeRequest()
函数接受一个 callback
参数,该参数将在请求成功时执行。
在我之前的示例中,我不得不发出 5 次请求,因此行为应该如下所示:
makeRequest(function () {
makeRequest(function () {
makeRequest(function () {
makeRequest(function () {
makeRequest(function () {
});
});
});
});
});
我如何设计它以对给我的 任何 参数表现相同,无论是 6、12 还是 1?
PS: 我尝试了很多方法,最常见的涉及创建 while 循环,等待完成的请求设置标志。所有这些方法都会让浏览器认为脚本崩溃并提示用户停止脚本。
简单,递归调用 ajax 请求,同时跟踪计数变量:
function makeRequest(count, finalCallback){
someAjaxCall(data, function(){
if(count > 1){
makeRequest(count - 1, finalCallback);
} else {
finalCallback && finalCallback();
}
});
}
finalCallback
是一个可选的回调(函数),将在所有请求完成时执行。
你可以这样做,
var i = 5; // number of calls to you function calling ajax
recurs(i); // call it initially
function recurs(count) {
makeRequest(function() {
count--; // decrement count
if (count > 1) {
recurs(count) // call function agian
}
});
}
这里我使用 promises 编写了多个 Ajax 调用。此函数将 运行 同步。您可以获得从 Ajax.
执行的响应的当前位置
var ajaxs = {
i : 0,
callback : null,
param : null,
exec_fun : function (i) {
let data_send = this.param[i];
let url = this.url;
this.promise = new Promise(function (res,rej) {
$.ajax({
url: url,
method: 'POST',
data: data_send,
dataType: 'json',
success: function(resvalidate){
res(resvalidate);
}
});
});
this.promise.then(function (resvalidate) {
let resp = resvalidate,
param = ajaxs.param,
pos = ajaxs.i,
callback_fun = ajaxs.callback_fun;
callback_fun(resp,ajaxs.i);
ajaxs.i++;
if( ajaxs.param[ajaxs.i] != undefined){
ajaxs.exec_fun(ajaxs.i);
}
});
},
each : function (url,data,inc_callback) {
this.callback_fun = inc_callback;
this.param = data;
this.url = url;
this.exec_fun(ajaxs.i);
}
};
let url = "http://localhost/dev/test_ajax.php";
let data_param = [{data : 3},{data : 1},{data : 2}];
ajaxs.each(url,data_param, function (resp,i) {
console.log(resp,i);
});
假设我有一些名为 makeRequest()
的函数,它向服务器发出 AJAX 请求。
现在假设我知道应该发出此请求的次数,但我不能异步执行,而是同步执行。
比如给我5号,我叫makeRequest()
,打完再打,打完再打……我应该最后调用它 5 次。
我不是 JavaScript 方面的专家,但我发现使用回调处理异步调用很容易。
因此,我的 makeRequest()
函数接受一个 callback
参数,该参数将在请求成功时执行。
在我之前的示例中,我不得不发出 5 次请求,因此行为应该如下所示:
makeRequest(function () {
makeRequest(function () {
makeRequest(function () {
makeRequest(function () {
makeRequest(function () {
});
});
});
});
});
我如何设计它以对给我的 任何 参数表现相同,无论是 6、12 还是 1?
PS: 我尝试了很多方法,最常见的涉及创建 while 循环,等待完成的请求设置标志。所有这些方法都会让浏览器认为脚本崩溃并提示用户停止脚本。
简单,递归调用 ajax 请求,同时跟踪计数变量:
function makeRequest(count, finalCallback){
someAjaxCall(data, function(){
if(count > 1){
makeRequest(count - 1, finalCallback);
} else {
finalCallback && finalCallback();
}
});
}
finalCallback
是一个可选的回调(函数),将在所有请求完成时执行。
你可以这样做,
var i = 5; // number of calls to you function calling ajax
recurs(i); // call it initially
function recurs(count) {
makeRequest(function() {
count--; // decrement count
if (count > 1) {
recurs(count) // call function agian
}
});
}
这里我使用 promises 编写了多个 Ajax 调用。此函数将 运行 同步。您可以获得从 Ajax.
执行的响应的当前位置var ajaxs = {
i : 0,
callback : null,
param : null,
exec_fun : function (i) {
let data_send = this.param[i];
let url = this.url;
this.promise = new Promise(function (res,rej) {
$.ajax({
url: url,
method: 'POST',
data: data_send,
dataType: 'json',
success: function(resvalidate){
res(resvalidate);
}
});
});
this.promise.then(function (resvalidate) {
let resp = resvalidate,
param = ajaxs.param,
pos = ajaxs.i,
callback_fun = ajaxs.callback_fun;
callback_fun(resp,ajaxs.i);
ajaxs.i++;
if( ajaxs.param[ajaxs.i] != undefined){
ajaxs.exec_fun(ajaxs.i);
}
});
},
each : function (url,data,inc_callback) {
this.callback_fun = inc_callback;
this.param = data;
this.url = url;
this.exec_fun(ajaxs.i);
}
};
let url = "http://localhost/dev/test_ajax.php";
let data_param = [{data : 3},{data : 1},{data : 2}];
ajaxs.each(url,data_param, function (resp,i) {
console.log(resp,i);
});