0

我有以下代码:

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。

4

1 回答 1

2

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

如果它没有在数组中返回,考虑到每个传入的 Promise 可能返回多个参数,它如何为每个传入的 Promise 返回不同的结果?

从文档中:

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

在将多个 Deferred 对象传递给 jQuery.when 的情况下,该方法从一个新的“主” Deferred 对象返回 Promise,该对象跟踪它已传递的所有 Deferred 的聚合状态。该方法将在所有 Deferred 解析后立即解析其主 Deferred,或者在其中一个 Deferred 被拒绝时拒绝主 Deferred。如果主 Deferred 已解析,则将传递给 jQuery.when 的所有 Deferred 的解析值传递。例如,当 Deferred 是 jQuery.ajax() 请求时,参数将是请求的 jqXHR 对象,按照它们在参数列表中给出的顺序。

于 2013-02-14T15:57:48.967 回答