jQuery延迟-多个块中的执行顺序

时间:2019-03-11 15:19:41

标签: javascript jquery asynchronous es6-promise jquery-deferred

注意
仅在特定的服务器端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 个答案:

答案 0 :(得分:1)

根据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>