我有以下代码:
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版。
答案 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对象 他们在参数列表中给出的顺序。