【发布时间】:2018-11-17 09:08:41
【问题描述】:
我不太确定下一个有什么区别:
$(document).ready(function() {
function resolveAtOnce() {
var d = $.Deferred();
// return d.resolve("Ok 1").promise(); // works
return d.resolve("Ok 2"); // works also
//d.resolve("Ok 3");
return d.promise();
}
resolveAtOnce().done(function(response) {
console.log("Resolved with response: '" + response + "'");
}).fail(function(error) {
console.log("Resolved with response: '" + error + "'");
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
这三种方法之间有什么区别吗?一切似乎都奏效了。运行示例:https://jsfiddle.net/u819mv7e/。
【问题讨论】:
-
从已解决的延迟对象中返回 #1 中的承诺没有多大意义——您已经有了对它的引用。在现实世界的示例中,您也不会立即
return已解决的承诺,因此#2 有点奇怪。 #3 是最常见的用法,因为resolve()将在您等待的任何异步代码块完成后调用。 -
是的,你可以从一个函数中返回一个承诺。您的所有三个变体都是这样做的。苏……你还有什么问题?
-
@Tomalak 根据这篇文章,这是不同的:stackoverflow.com/questions/7641964/…。
-
@RoryMcCrossan 如果我有下一个函数怎么办:
function calculate(item) { var d = $.Deferred(); if(item.alreadyCalculated()) return d.resolve("ok"); else async_call_calculate ....在这种情况下,我需要立即返回已解决的承诺。 -
@RoryMcCrossan 也许那么#3 是最合适的。
标签: jquery jquery-deferred deferred