javascript - Deferred 对象和它自己的 Promise 对象有什么区别?

标签 javascript jquery deferred

让我们创建一个简单的延迟对象:

defer = $.Deferred( function ( defer ) {
    setTimeout( defer.resolve, 3000 );
});

上面的Deferred对象会处于“pending”状态3秒,然后切换到“resolved”状态(此时绑定(bind)到它的所有回调都会被调用)。

让我们也检索该 Deferred 对象的 Promise:

promise = defer.promise();

现在,要添加在延迟对象解析后调用的回调,我们可以使用 .done().then()。但是,我们可以在 Deferred 对象本身或其自己的 Promise 对象上both调用此方法。

defer.then( handler );

promise.then( handler );

在这两种情况下,都会调用 handler 函数(在本例中为 3 秒后)。

如果我们使用$.when,我们可以再次传递 Deferred 对象本身或其 Promise 对象:

$.when( defer ).then( handler );

$.when( promise ).then( handler );

再次强调,上面两行代码没有区别。

现场演示: http://jsfiddle.net/G6Ad6/

所以,我的问题是,因为我们可以在 Deferred 对象本身上调用 .then().done() 等,并且因为我们可以传递该 Deferred对象放入 $.when() 中,.promise() 和检索 Promise 对象有什么意义? Promise 对象的目的是什么?为什么功能上会出现这种冗余?

最佳答案

它创建延迟值的“密封”副本,没有 .resolve().reject() 方法。来自 the documentation :

The deferred.promise() method allows an asynchronous function to prevent other code from interfering with the progress or status of its internal request.

当要修改的值没有意义时使用。例如,当 jQuery 发出 AJAX 请求时,它会返回一个 Promise 对象。在内部,它的 .resolve() 是原始 Deferred 对象的值,用户通过 Promise 观察到该值。

关于javascript - Deferred 对象和它自己的 Promise 对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8073528/

相关文章:

javascript - 具有 HOC 的命名导出

javascript - 如何使用 JQuery 查找页面上特定图像的数量

jquery - img 标签周围的空格会导致不同的布局

javascript - AJAX - 同时运行两个请求,但其中一个以一定间隔重复运行

jQuery 触发器延迟返回

Javascript : function statement requires a name

javascript - 悬停在使用 d3.js 创建的条形图条上后触发 2 个鼠标悬停事件?

JQuery 数据表和 ASP.NET UpdatePanel

Kotlin协程如何取消async await()

javascript - 类继承,并使用 Coffeescript 需要来自不同文件的子类