延迟对象:解析后重新启动

时间:2013-02-06 10:39:59

标签: jquery deferred

如何将Deffered从已解决的状态设置回初始状态?

我尝试创建一个新的队列,但在这种情况下,我将丢失到目前为止我添加的所有事件,如果我不先解决它。

是否可能存在Deferred的状态模型(处理 - >已解决...可能介于两者之间,如何从已解决到处理......)

这是我到目前为止所做的:

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <title>Demo</title>
    <script src="jquery-1.8.3.min.js"></script>
    <script>
        var deferredReady = jQuery.Deferred();

        $(function () {
            $('#Queue1, #Queue2').click(function () {
                var text = $(this).text();
                deferredReady.done(function () {
                    $('<p>', {
                        text: text
                    }).appendTo('body');
                });
            });
            $('#QueueReady').click(function () {
                deferredReady.resolve();
            });
            $('#NewQueue').click(function () {
                // deletes the old queue (resolve it first)
                deferredReady = jQuery.Deferred();
            });
        });
    </script>
</head>
<body>
    <button id="Queue1">Add Comamnd to ready Queue</button>
    <button id="Queue2">Add  otherComamnd to ready Queue</button>
    <button id="QueueReady">Set Queue to ready</button>
    <button id="NewQueue">Set Queue to ready</button>
</body>
</html>

1 个答案:

答案 0 :(得分:1)

不,这可以解决延迟对象的原始意图。只要Deferred被解析或拒绝,就会调用先前指定的回调,并且延迟将不可撤销从其初始“挂起”状态更改为“已解决”或“已拒绝”。您将其设置回初始状态会有什么期望?如果要将新处理程序添加到可能已解决或可能尚未解析的延迟对象,则这不是问题。将立即调用该处理程序:

$.Deferred().resolve().then(function() { alert('This works!'); });