【问题标题】:What's the difference between a Deferred object and its own promise object?Deferred 对象和它自己的 Promise 对象有什么区别?
【发布时间】:2011-12-25 18:56:41
【问题描述】:

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

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

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

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

promise = defer.promise();

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

defer.then( handler );

promise.then( handler );

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

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

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

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

同样,上面两行代码没有区别。

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

所以,我的问题是,既然我们可以在 Deferred 对象本身上调用 .then().done() 等,并且因为我们可以将该 Deferred 对象传递给 $.when(),那么 .promise() 的意义何在?承诺对象?承诺对象的目的是什么?为什么会有这种功能冗余?

【问题讨论】:

    标签: javascript jquery deferred


    【解决方案1】:

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

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

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

    【讨论】:

    • 啊,这是一个密封的副本duh...这解释了它。
    • 补充一点,这让我更清楚,来自docs:“Promise 对象 - 这个对象提供了 Deferred 对象的方法的子集(然后,完成,失败, always、pipe 和 state) 以防止用户更改 Deferred 的状态。"
    【解决方案2】:

    当使用 Deferred 对象的“承诺”时,观察者(例如等待解析的对象)不能直接访问 Deferred 对象本身,因此他们不能调用例如该方法的“Resolve”方法延期。这是一种保护原始 Deferred 的方式。

    【讨论】:

      【解决方案3】:

      使用 Deferred,您可以控制其状态 set

      当涉及到 Promise 时,您可以读取状态并可能附加回调。 get

      【讨论】:

        猜你喜欢
        • 2011-09-23
        • 2013-06-26
        • 2011-07-31
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        相关资源
        最近更新 更多