是否可以重置jQuery延迟对象状态?

时间:2012-08-01 15:32:02

标签: jquery-deferred

是否可以将已解析的jQuery对象重置为“未解析”状态并重新启动它的初始化和回调?

我正在做的具体事情是我在本地文件系统api上有一个jQuery延迟包装器。从那里,我为我关心的事物建立了更高级别的延期:

var getFs = defFs.requestQuota(PERSISTENT, 1024*1024)
              .pipe (bytes) -> defFs.requestFs(PERSISTENT, bytes)

var getCacheContents = getFs.pipe (fileSystem) -> 
      defFs.getDirectory('Cache', fileSystem.root).pipe (dir) ->
          defFs.readEntries(dir)

现在大部分时间,当我调用getCacheContents时,我不介意返回的备忘值,实际上我更喜欢它。但是,在我想写入缓存的情况下,我真的希望能够重置该管道并让它在下次访问时重新选择并重新扫描缓存。

我可以从$ .Callbacks一起拼凑一些东西但是基于延迟的解决方案真的很理想。

3 个答案:

答案 0 :(得分:19)

没有。 Promise unresolved只有definition只能解析一次 - 从fulfilledrejected或到Deferred。您将无法使用jQuery的{{1}} s。

执行此操作

您实际搜索的内容是Signals。它们不止一次被触发,但提供了类似的界面。有一些实现,您可能会发现js-signalswire.js

答案 1 :(得分:3)

我能找到的唯一解决方案是重置$.Deferred对象并从该对象返回新的Promise。它与一些内部API脏检查(如果某些内容被编辑/删除)一起工作,但只是重置现有的$.Deferred并让它在下一个Promise请求时重新解析会更有效。

答案 2 :(得分:0)

可能解决方案的一个例子是:

$.myDeferredList = [];
$.createRestorableDeferred = function(a,b) {
    // JUST BY SIMPLE $.when().then();
    $.myDeferredList[a] = {
        deferred: $.Deferred()
        , then: b
        ,restore : function() {
            $.myDeferredList['myReady'].deferred = $.Deferred();
            $.when($.myDeferredList['myReady'].deferred).then($.myDeferredList['myReady'].then);
        }
        ,resolve : function() {
            $.myDeferredList['myReady'].deferred.resolve();
        }
    }
    $.when($.myDeferredList['myReady'].deferred).then($.myDeferredList['myReady'].then);
    window[a] = $.myDeferredList['myReady'];
}

 var counter = 0;
 $.createRestorableDeferred('myReady', function () {
     console.log('>> myReady WHEN called',++counter);
     $.myDeferredList['myReady'].restore();

 });

// RESOLVING ways

$.myDeferredList['myReady'].deferred.resolve();
$.myDeferredList.myReady.deferred.resolve();
myReady.resolve();

控制台中的结果:

 >> myReady WHEN called 1

 >> myReady WHEN called 2

 >> myReady WHEN called 3