假设您有以下代码:
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而不是整个延迟对象。这就是我现在在实际代码中执行的操作,只是忘了在这里添加它。
答案 0 :(得分:2)
我没有使用自定义Deferred对象,但我的理解是你的例子有两个不同之处:
使用$.when()
可以随意添加更多延迟对象以供处理程序处理。显然,这不是什么大问题,因为你必须改变这行代码以增加更多的延迟。
$.when()
只获取Promise对象,而不是整个延迟对象,如果我理解正确的是隐藏延迟状态更改方法的一致性度量(例如resolve()
),公开处理程序挂钩和状态检查方法。这似乎是一种很好的做法,但在您的示例中,您可以通过调用someProcess().promise()
而不是$.when(someProcess())
来执行相同的操作。
所以我认为你是对的 - 这两种方法都可行,但使用$.when()
的主要好处是使代码更易读,并为其他程序员设置适当的期望。使用$.when()
或deferred.promise()
还可以帮助防止一些不那么有能力的编码人员以混乱的方式搞乱您的延期状态。