假设您有以下代码:
function someProcess() {
var deferred = $.Deferred();
apiCall(function (recvData) {
deferred.resolveWith(null, [recvData]);
});
return deferred.promise();
}
function mainFunction() {
$.when(someProcess())
.then(someOtherProcess);
}
在这个例子中,我只需要等待一个延迟得到解决。在这种情况下,按上面编写第二个函数与按如下方式编写第二个函数之间有什么区别(如果有):
function mainFunction() {
someProcess()
.then(someOtherProcess);
}
我的意思是,我喜欢用第一种方式编写它,因为它清楚地表明我们正在使用 jQuery 延迟对象,但我很好奇在这种情况下是否有必要。
编辑:我修复了 then() 调用中的拼写错误。感谢您发现这一点。
编辑:感谢 nrabinowitz 的回答。我认为您已经解决了我在使用 when() 与使用原始 jQuery 延迟对象实例方面不确定的要点。我再次修复了我的代码以返回一个 promise 而不是整个延迟对象。这就是我现在在实际代码中执行的方法,只是忘记在此处添加它。
最佳答案
我没有使用自定义 Deferred 对象,但我的理解是您的示例中有两个不同之处:
使用
$.when()
允许您任意添加更多延迟对象以供处理程序处理。显然,这没什么大不了的,因为无论哪种方式,您都必须更改该行代码才能添加更多延迟。$.when()
只获取 Promise 对象,而不是整个 deferred 对象,如果我理解正确的话,这是隐藏 deferred 的状态更改方法的一致性措施(例如resolve()
),仅公开处理程序 Hook 和状态检查方法。这似乎是一个很好的做法,但在您的示例中,您可以通过调用someProcess().promise()
而不是$.when(someProcess())
来完成相同的操作。
所以我认为你是对的 - 两种方法都可以工作,但是使用 $.when()
的主要好处是使代码更清晰并为其他程序员适当设置期望。使用 $.when()
或 deferred.promise()
还有助于防止一些能力较差的编码人员以令人困惑的方式弄乱 deferred 的状态。
关于jquery - 您是否需要将 jQuery.when 与单个延迟对象一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7958153/