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は、定義上、1回だけ解決されるものです-fromunresolvedからfulfilledORto rejected。jQueryではこれを行うことはできませんDeferred

実際に検索しているのはSignalsです。それらは複数回解雇されますが、同様のインターフェースを提供します。周りにいくつかの実装があります、あなたはceckoutjs-signalsまたはかもしれませんwire.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();

コンソールでの結果:

>>myReadyWHENが1と呼ばれる

 >>myReadyWHENが2と呼ばれる

 >>myReady3と呼ばれるとき
于 2018-03-11T15:06:43.810 に答える