4

假设您有以下代码:

function someProcess() {
    var deferred = $.Deferred();

    apiCall(function (recvData) {
        deferred.resolveWith(null, [recvData]);
    });

    return deferred.promise();
}

function mainFunction() {
    $.when(someProcess())
        .then(someOtherProcess);
}

在这个例子中,我只需要等待一个 deferred 被解决。在这种情况下,像上面那样编写第二个函数与像这样编写它有什么区别(如果有的话):

function mainFunction() {
    someProcess()
        .then(someOtherProcess);
}

我的意思是,我喜欢以第一种方式编写它,因为它清楚地表明我们正在使用 jQuery 延迟对象,但我很好奇在这种情况下是否有必要。

编辑:我修复了 then() 调用中的错字。谢谢你抓住那个。

编辑:感谢nrabinowitz的回答。我认为您已经明确了我在使用 when() 与使用原始 jQuery 延迟对象实例方面不确定的要点。我再次修复了我的代码以返回一个承诺而不是整个延迟对象。这就是我现在在实际代码中的做法,只是忘记在此处添加。

4

1 回答 1

2

我没有使用自定义 Deferred 对象,但我的理解是您的示例中有两个不同之处:

  • Using$.when()允许您任意添加更多延迟对象以由您的处理程序处理。显然,这没什么大不了的,因为您必须以任何一种方式更改该行代码以添加更多延迟。

  • $.when()只得到 Promise 对象,而不是整个 deferred 对象,如果我理解正确的话,它是一种隐藏 deferred 的状态更改方法(例如resolve())的一致性措施,只公开处理程序挂钩和状态检查方法。这似乎是一种很好的做法,但在您的示例中,您可以通过调用someProcess().promise()而不是$.when(someProcess()).

所以我认为你是对的——这两种方法都可以,但使用的主要好处$.when()是使代码更清晰,并为其他程序员适当地设定期望。使用其中一个$.when()deferred.promise()将另外有助于防止一些能力较弱的编码器以令人困惑的方式弄乱您的延迟状态。

于 2011-10-31T18:57:13.820 回答