延迟对象和它自己的承诺对象有什么区别?

27

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

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

上述Deferred对象将保持“pending”状态3秒钟,然后切换到“resolved”状态(此时绑定到它的所有回调函数都将被调用)。

我们还将检索该Deferred对象的Promise:

promise = defer.promise();

现在,要添加在Deferred对象解决后将被调用的回调函数,我们可以使用.done().then()。但是,我们可以在Deferred对象本身或其自己的promise对象上同时调用此方法。

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对象的目的是什么?为什么会有这种重复的功能?

3个回答

25
它创建了一个“封闭”的延迟值的副本,没有 .resolve().reject() 方法。根据文档

deferred.promise() 方法允许异步函数防止其他代码干扰其内部请求的进度或状态。

当值不应该被修改时使用它。例如,当 jQuery 发送 AJAX 请求时,它返回一个 promise 对象。在内部,它会为原始的 Deferred 对象 .resolve() 一份值,用户用 promise 来观察这个值。


1
啊,这是一个密封的副本咳咳...这就解释了。 - Šime Vidas
1
为了更好地解释这一点,从文档中可以得知:"Promise对象 - 此对象提供了Deferred对象的一部分方法(then、done、fail、always、pipe和state),以防止用户改变Deferred的状态。" - Nick M

2
使用Deferred对象的“promise”时,观察者(等待解决的对象)无法直接访问Deferred对象本身,因此它们无法调用该Deferred的“Resolve”方法。这是一种保护原始Deferred的方式。

0

使用延迟对象,你可以控制它的状态 set

关于 Promise,你可以读取状态并可能附加回调函数。 get


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接