jQuery承诺(当>然后)不使用$ .each和$ .ajax迭代数组

时间:2016-02-15 11:53:51

标签: javascript jquery arrays ajax asynchronous

我一直在寻找和尝试这么多变化,没有运气。

我有一系列用户:

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

感谢所有的回复,我真的希望有一个解决方案!

1 个答案:

答案 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(...))
}