jQuery deferreds - порядок выполнения в нескольких блоках - PullRequest
2 голосов
/ 11 марта 2019

Примечание
Эта проблема как-то происходит только с определенным API на стороне сервера. Поэтому это решает не ту проблему. Я не буду удалять его, поскольку у него есть ответы и комментарии.


Я пытаюсь выполнить несколько ajax-запросов, сделать некоторые вещи после того, как каждый будет сделан, и некоторые другие вещи после того, как все они будут выполнены, для этого я использую код ниже:

let
        myarr = [],
        myfunc = arg => myarr.push(arg);

$.when(
    $.post(myparams).done(myfunc),
    $.post(otherparams).done(myfunc),
    $.post(yetanother).done(myfunc)

// it comes out with only one arg
).then(e => console.log(myarr));

Но когда дело доходит до выполнения блока then, он обычно выполняет только done первой операции, как я могу это исправить?

Извините, если это дубликат, но, честно говоря, я даже не знал, что искать: /


Комментарий

Я также пытался создать свои собственные отложенные объекты, в которых я выполнял бы ajax и разрешал их внутри блока done, но это дало те же результаты.

Использование только done или только then, то же самое.

1 Ответ

1 голос
/ 11 марта 2019

В документации jQuery по $.when():

Каждый аргумент [из .then()] - это массив со следующей структурой: [ data, statusText, jqXHR ]

То есть вы могли бы сделать что-то вроде этого ...

$.when(
  $.post(myparams),
  $.post(otherparams),
  $.post(yetanother)
).then((res1, res2, res3) => { //Arg for each result
  myfunc(res1[0]);             //Call myfunc for result 1's data
  myfunc(res2[0]);             //Call myfunc for result 2's data
  myfunc(res3[0]);             //Call myfunc for result 3's data
});

Хотя, возможно, более чистая версия могла бы быть чем-то вроде этого ...

let
  myarr = [],
  myfunc = arg => myarr.push(arg);

$.when(
  $.get('https://jsonplaceholder.typicode.com/todos/1'),
  $.get('https://jsonplaceholder.typicode.com/todos/2'),
  $.get('https://jsonplaceholder.typicode.com/todos/3')
).then((...results) => {                  //Get all results as an array
  results.map(r=>r[0]).forEach(myfunc);   //Call myfunc for each result's data
  console.log(myarr);
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
...