多个$ .getJSON请求在promise中以不同方式返回

时间:2013-02-14 15:50:00

标签: jquery jquery-deferred promise

我有以下代码:

var aReq = $.getJSON('/path/A'),
    bReq = $.getJSON('/path/B');

$.when(aReq, bReq).then(function(A, B) {
  console.log(A, B);
  // logs: [Array[5], "success", Object], [Array[20], "success", Object]
});

为什么这包裹在“jqXHR数组”中?

只有一个$.getJSON,这不会发生:

var aReq = $.getJSON('/path/A');
$.when(aReq).then(function(A) {
  console.log(A);
  // logs: [Object, Object, Object, Object, Object]
  // just like I wanted it in the first version
});

有没有办法完成第一个版本的工作?也许我明白了承诺/延期对象的错误。

FWIW:在这种情况下我使用的是jQuery 1.7.1版。

1 个答案:

答案 0 :(得分:2)

这在api中有很好的记录,表现为预期的行为:http://api.jquery.com/jQuery.when/

如果它没有在数组中返回,那么如果每个传递的promise都会返回不同的结果,那么它会如何返回多个参数?

来自文档:

  

如果将单个参数传递给jQuery.when并且它不是Deferred   或承诺,它将被视为已解决的延期和任何   附加的doneCallbacks将立即执行。 doneCallbacks   传递原始参数。在这种情况下,任何failCallbacks你   可能设置永远不会被调用,因为延迟永远不会被拒绝。

     

如果将多个Deferred对象传递给jQuery.when,   该方法从新的“主”延迟对象返回Promise   它跟踪所有Deferred的聚合状态   通过。该方法将尽快解决其主延期   延迟解决,或拒绝主人延期一个   延期被拒绝。如果主Deferred被解析,那就是   传递了传递给的所有Deferred的已解析值   jQuery.when。例如,当Deferreds是jQuery.ajax()时   请求,参数将是请求的jqXHR对象   他们在参数列表中给出的顺序。