【问题标题】:How to immediately resolve or reject jQuery promise?如何立即解决或拒绝 jQuery 承诺?
【发布时间】: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


【解决方案1】:

这些有区别吗?

return d.resolve("Ok 1").promise(); // works

这将返回一个已解决的 Promise 对象。在接口级别,promise 被定义为至少支持.then() 方法的对象。 (这就是为什么这些类型的对象也被称为 thenable。)

在 jQuery 中,出于历史原因(在有稳定标准之前,jQuery 实现了 Promise),它们还支持 .done().fail() 和其他一些。

return d.resolve("Ok 2"); // works also

这将返回一个已解析的 Deferred 对象。 Deferred 是 a superset of promises,这意味着它们是 thenable 并且支持 jQuery 承诺支持的所有相同方法,并且可以将它们视为承诺对象。

Deferred 对象和 Promise 对象的区别在于,promise 有一个固定的状态,解析后无法更改,但 Deferred 的状态实际上是可以更改的。

d.resolve("Ok 3");
return d.promise();

这与示例 #1 相同。

那么,你应该使用什么?

使用 jQuery deferreds 时,始终返回 .promise(),因为它们符合具有不可更改状态的要求。

【讨论】:

    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 2023-03-26
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 2018-11-20
    • 2014-05-27
    • 2018-05-11
    相关资源
    最近更新 更多