Is it possible to reset a jQuery deferred object state?

我是研究僧i 提交于 2019-12-01 03:09:09

No. A Promise is by definition a thing that resolves only once - from unresolved to fulfilled OR to rejected. You will not be able to do this with jQuery's Deferreds.

What you are actually searching for are Signals. They are to be fired more than once, but provide a similiar interface. There are some implementations around, you might ceck out js-signals or wire.js.

The only solution I could find is to reset the $.Deferred object and return new Promise from that one. It works together with some internal API dirty checking (if something gets edited / deleted), but would be more performant to just reset the existing $.Deferred and let it re-resolve on the next Promise request.

An example of a possible solution is:

$.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();

Results in console:

 >> myReady WHEN called 1

 >> myReady WHEN called 2

 >> myReady WHEN called 3
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!