我一直在寻找和尝试这么多变化,没有运气。
我有一系列用户:
var arr = ['tom', 'sally', 'jill', 'sam', 'john'];
我想用$ .ajax将这些用户传递到2个API(相同的站点,不同的URL,用于不同的数据集):
function getStatus1() {
return $.each(arr, function (index, value) {
arrStatus.push($.ajax({
url: 'https://some/url',
dataType: 'json'
})
.always(function (response) {
console.log('from getStatus1');
}));
});
}
function getStatus2() {
return $.each(arr, function (index, value) {
arrStatus.push($.ajax({
url: 'https://some/url',
dataType: 'json'
})
.always(function (response) {
console.log('from getStatus2');
}));
});
}
$.when(getStatus1(), getStatus2()).then(function () {
console.log('after getStatuses');
});
无论我尝试什么,我总是首先得到'getStatuses',我收集的是因为我没有在我的函数中返回承诺......但我不知道为什么会这样!
这篇文章是我最接近我的情况,但它不涉及使用$ .each或数组...... :( jQuery Promise then not working after AJAX
我真的很感激任何人都可以解决我的问题。
谢谢!
修改 这是一个展示我的ajax困境的Plnkr: https://plnkr.co/edit/jRAAjXX4zFprUbx1KPlN?p=preview
感谢所有的回复,我真的希望有一个解决方案!
答案 0 :(得分:1)
$.each
不返回值,因此没有返回值。
不使用$.each
,而是使用Array.prototype.map
(jQuery中没有等价物)和return
回调中的承诺,例如
function getStatus1() {
return arr.map(function(value, index) {
return $.ajax({
url: 'https://some/url',
dataType: 'json'
});
});
}
但是,请注意,您现在(一旦修复了这两个函数)获得了两个承诺数组。除非您执行以下操作,否则$.when()
将无法处理嵌套:
$.when($.when.apply($, getStatus1()), $.when.apply($, getStatus2()).then(...)
或者安排两个函数从其数组中返回单个promise:
function getStatus1() {
return $.when.apply($, arr.map(...))
}