与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);
});
像蟒蛇一样,我不想重复自己10次
我试图创建一个for循环但似乎不可能在$ .when()中编写for循环。
任何想法如何实现这一点?
我在没有结果的地方搜索过。
非常感谢,
答案 0 :(得分:2)
在你的$。之前定义一个函数应该是什么可能是这样的:
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));
如果你想用更多的参数动态创建这个函数调用,你可以创建这些for循环的数组,然后调用$ .when.apply(this,array)
$.when.apply(this, your_request_array)
请参阅:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/apply
希望这有帮助
答案 1 :(得分:0)
您可以使用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
指令基于此
答案 2 :(得分:0)
将你的承诺放在一个数组中:
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]);
});
});