【问题标题】:Why does deferred.when() return promises in done callback?为什么 deferred.when() 在完成回调中返回承诺?
【发布时间】:2015-08-07 01:34:09
【问题描述】:

为什么jQuery的deferred.whendone回调中返回promise,而不是它们对应的响应数据?

var data = {
    json: JSON.stringify({
        text: 'some text',
        array: [1, 2, 'three'],
        object: {
            par1: 'another text',
            par2: [3, 2, 'one'],
            par3: {}
        }
    }),
    delay: 3
};

var firstRequest =  $.ajax({
    url:'/echo/json/',
    data: data,
    type: 'POST'
});

var secondRequest =  $.ajax({
    url:'/echo/json/',
    data: data,
    type: 'POST'
});

$.when.apply($, [firstRequest, secondRequest]).done(function(data1, data2){
    console.log(data1); // returns array, I expect a response object
    console.log(data2); 
});

documentation 和 SO 上的各种答案(如 this)都暗示我应该获取实际的响应对象,而不是带有 [responseobject, textstatus, jqxhr] 的数组。

http://jsfiddle.net/2h48mr78/

【问题讨论】:

  • 呃,再读一遍jQuery docs$.ajax 调用的示例明确说明“每个参数都是具有以下结构的数组:[data, statusText, jqXHR]
  • @Bergi Wops,有时候你需要两双眼睛......

标签: javascript jquery ajax promise


【解决方案1】:

您得到了正确的结构,但是 data1data2 参数并不是实际数据本身。它实际上是一个包含三个项目的数组,data, statusText, jqXHR 所以你的数据实际上在data1[0] 中,这将注销:

Object {text: "some text", array: Array[3], object: Object}

文档有点不清楚,但在示例部分显示了它是如何工作的。

【讨论】:

  • 我已经看到了,困扰我的是不一致。详细地说,你不能依赖数组结构。如果你传递了一个自定义的承诺怎么办:jsfiddle.net/2h48mr78/4无论如何我都希望找到响应对象。
  • 你应该看看其他的承诺实现。
  • @Johan 已经在 jQuery 3.0 中修复了它的价值。
猜你喜欢
  • 2016-06-15
  • 2022-01-26
  • 2023-03-17
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
相关资源
最近更新 更多