是否有可能重新设定一个jQuery Deferred对象的状态?(Is it possible to

2019-06-26 16:28发布

是否有可能解决一个jQuery对象重置为“未解决”状态,并揭开序幕,它的初始化和一遍回调?

我在做具体的事情是,我没有对本地文件系统的API一个jQuery推迟包装。 从那里,我建立了我关心的事情较高水平deferreds:

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凑齐的东西,但一个递延式的解决方案真的会是理想的。

Answer 1:

第一个Promise是通过定义解析只有一次的事情-从unresolved ,以fulfilledrejected 。 您将无法使用jQuery的做到这一点Deferred秒。

您实际搜索的信号 。 他们是被解雇不止一次,而是提供一个类似的界面。 有一些实现了,那可能ceck了js-signalswire.js



Answer 2:

我能找到的唯一的解决办法是重置$.Deferred对象,并从一个新的回报承诺。 它与一些内部API脏检查(如果有些东西被编辑/删除)一起工作,但会更高性能的只是重置现有$.Deferred ,让它重新决心在下一个承诺要求。



Answer 3:

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

$.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


文章来源: Is it possible to reset a jQuery deferred object state?