多次循环 ajax 请求,一次回调
Multiple looped ajax requests with one callback
与 this article 一样,我有几个 ajax 请求要执行,然后是 1 个操作。
然而,不同的是,我所有的 ajax 请求仅相差一个增量参数,如下所示:
$.when(
// ajax requests
// 1
$.ajax({
url:"https://www.aaaaaaa.com?param="+0,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
}),
// 2
$.ajax({
url:"https://www.aaaaaaa.com?param="+2500,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
}),
// 3
$.ajax({
url:"https://www.aaaaaaa.com?param="+5000,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
})
// etc. ~10 times
).then(function() {
// action
console.log(data);
});
喜欢python我不喜欢重复10次
我试图制作一个 for 循环,但似乎无法在 $.when() 中编写 for 循环。
有什么实现方法吗?
我到处搜索都没有结果。
非常感谢,
您可以使用 Kriskowal 的 q 实现:https://github.com/kriskowal/q
有一种方法Q.allSettled(arrayOfPromises)
适合您的需要。
例如:
Q.allSettled(promises)
.then(function (results) {
results.forEach(function (result) {
if (result.state === "fulfilled") {
var value = result.value;
} else {
var reason = result.reason;
}
});
});
Angular 的 $q
指令基于此
可能应该工作的是在你的 $.when 之前定义一个函数,如下所示:
function createRequest(port) {
return $.ajax({
url:"https://www.aaaaaaa.com?param="+port,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
})
}
然后在你的 $.when
中使用它
$.when(createRequest(0), createRequest(2500), createRequest(5000));
如果您想使用更多参数动态创建此函数调用,您可以创建这些请求循环的数组,然后调用 $.when.apply(this, array)
$.when.apply(this, your_request_array)
参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
希望对您有所帮助
只需将您的承诺放入一个数组中即可:
var promises = [0, 2500, 5000].map(function(n) {
return $.ajax(...); // appending `n` to the URL as required
});
然后调用$.when.apply
:
$.when.apply($, promises).then(...)
传递给 .then
回调的参数将是单独的数组,每个数组包含单个 $.ajax
回调接收的三个参数。
顺便说一句,您当前的代码将按照调用完成的任何顺序连接数组,不一定按照它们开始的顺序。
如果连接的顺序很重要,你应该使用那些.then
函数参数而不是你现有的success
处理程序来创建你的data
变量:
then(function() {
var data = [];
[].forEach.apply(arguments, function(response) {
data = data.concat(response[0]);
});
});
与 this article 一样,我有几个 ajax 请求要执行,然后是 1 个操作。
然而,不同的是,我所有的 ajax 请求仅相差一个增量参数,如下所示:
$.when(
// ajax requests
// 1
$.ajax({
url:"https://www.aaaaaaa.com?param="+0,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
}),
// 2
$.ajax({
url:"https://www.aaaaaaa.com?param="+2500,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
}),
// 3
$.ajax({
url:"https://www.aaaaaaa.com?param="+5000,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
})
// etc. ~10 times
).then(function() {
// action
console.log(data);
});
喜欢python我不喜欢重复10次
我试图制作一个 for 循环,但似乎无法在 $.when() 中编写 for 循环。
有什么实现方法吗?
我到处搜索都没有结果。
非常感谢,
您可以使用 Kriskowal 的 q 实现:https://github.com/kriskowal/q
有一种方法Q.allSettled(arrayOfPromises)
适合您的需要。
例如:
Q.allSettled(promises)
.then(function (results) {
results.forEach(function (result) {
if (result.state === "fulfilled") {
var value = result.value;
} else {
var reason = result.reason;
}
});
});
Angular 的 $q
指令基于此
可能应该工作的是在你的 $.when 之前定义一个函数,如下所示:
function createRequest(port) {
return $.ajax({
url:"https://www.aaaaaaa.com?param="+port,
crossDomain: true,
dataType: "jsonp",
success: function (response) {
data = data.concat(response);
}
})
}
然后在你的 $.when
中使用它$.when(createRequest(0), createRequest(2500), createRequest(5000));
如果您想使用更多参数动态创建此函数调用,您可以创建这些请求循环的数组,然后调用 $.when.apply(this, array)
$.when.apply(this, your_request_array)
参见:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
希望对您有所帮助
只需将您的承诺放入一个数组中即可:
var promises = [0, 2500, 5000].map(function(n) {
return $.ajax(...); // appending `n` to the URL as required
});
然后调用$.when.apply
:
$.when.apply($, promises).then(...)
传递给 .then
回调的参数将是单独的数组,每个数组包含单个 $.ajax
回调接收的三个参数。
顺便说一句,您当前的代码将按照调用完成的任何顺序连接数组,不一定按照它们开始的顺序。
如果连接的顺序很重要,你应该使用那些.then
函数参数而不是你现有的success
处理程序来创建你的data
变量:
then(function() {
var data = [];
[].forEach.apply(arguments, function(response) {
data = data.concat(response[0]);
});
});