假设您有以下代码:
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对象,而不是整个延迟对象,如果我理解正确的是隐藏延迟状态更改方法(例如resolve())的一致性度量,只暴露处理程序挂钩和状态检查方法.这似乎是一种很好的做法,但在你的例子中,你可以通过调用someProcess().promise()而不是$.when(someProcess())来做同样的事情.
所以我认为你是对的 – 两种方法都可行,但使用$.when()的主要好处是使代码更易读,并为其他程序员设置适当的期望.使用$.when()或deferred.promise()将另外有助于防止一些不那么有能力的编码人员以令人困惑的方式搞乱你的延期状态.