【问题标题】:Better way to get a resolved promise in jQuery?在 jQuery 中获得已解决的承诺的更好方法?
【发布时间】:2014-09-25 22:44:42
【问题描述】:

在 jQuery 中使用 Promise 进行编程时,我有时需要从已解决的 Promise 开始,尤其是在像 this answer 中的方法 #2 中所示的循环中链接 .then() 时:

data.reduce(function(p, item) {
    return p.then(function() {
        return print(item);
    });
}, $.Deferred().resolve().promise());

所以,我知道我可以通过以下方式获得已解决的承诺:

$.Deferred().resolve().promise()

但是,这看起来有点丑陋和浪费(三个函数调用)。有没有更好的(更少的代码,更少的函数调用)方法来在 jQuery 中获得已解决的承诺,或者有更好的方法来编写上面的 .reduce() 循环?

【问题讨论】:

    标签: jquery promise deferred


    【解决方案1】:

    对于初学者 - 您不需要 .promise。 jQuery 延迟对象是already also promises,所以$.Deferred().resolve() 也可以工作。

    在我看来,它是使用 jQuery 的最佳方法,因为它是显式的,但也有更短的方法。我所知道的最短的是:

    $().promise(); // shorter but more hacky.
    
    $.Deferred().resolve(); // this will work and is what I'd do
    
    $.when(); // this is also a viable alternative 
    

    相当短。当然,如果有能力,最好使用更好的 promise 库,因为 jQuery promises 不能保证有序的异步执行,并且不允许错误处理,而且如果运行许多 promises 会非常慢。

    当然,没有人阻止你围绕它编写实用方法:)

    【讨论】:

    • 嗯。我发誓我看过一个点,jQuery Deferred 没有.then() - 只有一个承诺。奇怪 - 不知道我从哪里得到这个概念。不过,它现在似乎确实可以作为 thenable 工作。好的,这减少了一个函数调用。我同意我不喜欢$().promise(),因为这看起来很老套。
    • 在单独的说明中,您真的必须在几乎每一篇涉及该主题的帖子中都丢弃 jQuery 承诺吗?我使用 jQuery 生成的 Promise(比如从 Ajax 调用),所以我并不关心导入另一个不能与 jQuery 创建的 Promise 完全互操作的 Promise 库(不管是谁的错)。
    • @jfriend00 如果这听起来很粗鲁,我很抱歉,我自己有时也会使用 jQuery 承诺,但我全心全意地相信 jQuery 的承诺实现绝对是可怕的。我已经看到开发人员不止一次或两次陷入困境,我会尽可能向人们建议替代实现或原生承诺。我在一个例子中看到有人被 jQuery 承诺咬伤,就像你上周的 reduce 一样,.reduce 之后的代码在 reduce'd .then 之前执行,有时是因为它,他们花了半个小时才找到。我想尽可能地警告人们。
    • 我认为,如果您将切换到另一个 promise 库并将 jQuery 的 promise 实现丢弃到实现差异与正在讨论的特定问题特别相关的时候保存建议会更合适,而不是只是因为有人在他们的问题中提到了 jQuery 承诺。
    • 您的想法已被记录。我理解并尊重他们。我回答承诺问题是为了推广这项技术并帮助那些正在努力使用它的人,如果不提到这个常见的陷阱,我会觉得提供解决方案并不容易。尤其是当我上周在完全相同的场景中看到它时。您知道这一点,但您也可能知道您不是唯一阅读此答案的人。我没有写超过 200 个关于承诺的答案,只是为了促进人们掉入那个坑。感谢您的评论,但我会记住这一点并更加微妙。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-16
    • 2021-05-25
    • 1970-01-01
    • 2023-03-24
    相关资源
    最近更新 更多