【问题标题】:JQuery - $.when syntax for array of Deferred objects [duplicate]JQuery - 延迟对象数组的 $.when 语法[重复]
【发布时间】:2012-06-05 08:03:06
【问题描述】:

这是我第一次使用$.when,我在语法上遇到了困难。
我有类似于下面简化示例的代码。它有效(如果我在简化它时没有引起错误)。 我的问题是我不知道customerIds 数组将包含多少元素。

var customerIds = new [1, 2, 3];

$.when(
    getCustomerData(customerIds[0]),
    getCustomerData(customerIds[1]),
    getCustomerData(customerIds[2])
).then(function() {
    alert('success');
}).fail(function() {
    alert('error');
});

function getCustomerData(int id) {
    return new $.Deferred(function(defer) {
                    doSomeWork(id, defer);
    }).promise();       
}

我想将$.when 语句编写如下,但语法正确。

$.when(
    getCustomerDataCalls(customerIds),
).then(function() {
    alert('success');
}).fail(function() {
    alert('error');
});

getCustomerDataCalls 的实现方式为:

function getCustomerDataCalls(customerIds) {
    var dfds = [];

    for (var id in customerIds) {
        dfds.push(new $.Deferred(function(defer) {
                                    doSomeWork(id, defer);
                                 }).promise());     
    }

    return dfds;
}

不幸的是,我的实现出了点问题,我无法弄清楚哪里出错了。我最好的猜测是返回Deferreds 的数组时出了点问题

更新:
在 lanzz 提到我的人为示例已经返回 Deferred 之后,我更新了代码,我更新了我的示例以包含 doSomeWork

【问题讨论】:

  • 你不需要为每个$.get()调用实例化一个新的Deferred——$.get()已经返回了一个你可以使用的承诺
  • var dfds = new[]; 是错字吗?
  • @F.Calderan 确实是错字,感谢您的纠正。

标签: jquery syntax deferred


【解决方案1】:

是的,我也偶然发现了这一点:when 不允许传递数组。但是您可以使用apply 来达到预期的效果。

$.when.apply($, getCustomerDataCalls(customerIds))

【讨论】:

  • 在我看来,什么时候应该默认提供这种行为——即,如果第一个参数是一个数组,第二个参数是一个函数,那么当数组中的所有东西都完成后,调用函数与结果数组。实际上,when 并不是很有用,因为如果您事先知道有多少延迟调用,您可以轻松地自己编写代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
相关资源
最近更新 更多