15

是否可以将已解析的 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 拼凑一些东西,但基于延迟的解决方案确实是理想的。

4

3 回答 3

19

不,根据定义, APromise是一个只能解析一次的事物 - from到OR to 。您将无法使用 jQuery 的s.unresolvedfulfilledrejectedDeferred

您实际搜索的是Signals。它们将被多次触发,但提供类似的界面。周围有一些实现,您可能会退出js-signalswire.js.

于 2012-08-06T16:16:09.857 回答
3

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

于 2012-09-19T12:10:35.357 回答
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 何时调用 1

 >> myReady 何时调用 2

 >> myReady 何时调用 3
于 2018-03-11T15:06:43.810 回答