0

jQueryを機能させようとしていdeferredますが、いくつか問題があります。

私のシステムはpostMessage、Web サイトのサンドボックス化された領域との間でメッセージをやり取りするために使用しています。したがって、次のようなサンドボックス領域からサービスをリクエストすると:

// on click of button
foo.requestService(options, function (response) {
    $("#c").val(response); // set value of input button
}

内部的にはnew $.deferred、ボタンがクリックされてサービスがリクエストされるたびに、次のように作成しています。

that.requestService = $.fn.requestService = function (options, callbackFunction) {
    var deferred = new $.Deferred(),
        callbackId = priv.generateUuid(),
        callback = deferred;

    // store callback to be retrieved by response handler
    priv.trackCallback(callbackId, callback, callbackFunction);

    // set type
    if (options.type === undefined) {
        options.type = "request/any";
    }
    // the callback function to be run, once a postMessage
    // with the response is received
    deferred.done(function(result, callbackFunction) {
        if (callbackFunction) {
            callbackFunction(result);
        }
    });
    // trigger messaging
    window.top.postMessage(options, window.location.href);
};

すべて正常に動作し、サンドボックス サービスをリクエストして実行し、結果を postMessage して、それぞれのコールバックを取得できます。

priv.returnResult = function (event) {
    // here I get back the deferred (callback[0]) and callback function (callback[1])
    var callback = priv.retrieveCallback(event.data.callback);

    // problem = the callback stays resolved after the first function call
    console.log(callback[0].state());

    callback[0].resolve(event.data.result, callback[1]);
};

私の問題は、**new** $.Deferredサービスが要求されるたびに を作成していますが、遅延オブジェクトは初回のみ実行され、その後 に設定されresolved、それ以上の関数呼び出しで結果が返されないことです。

new $.Deferredサービスがリクエストされるたびに新しい deferred が生成されると思いました。これを解決して、コールバック関数を実行できます。

質問
これを機能させるにはどうすればよいですか? new が解決できる新しいオブジェクトを作成するのではありませんか? 以前の resolve.deferred オブジェクトを機能させるために、どうにか削除/削除する必要がありますか?

ありがとう!

4

1 に答える 1

0

「複数の遅延セッターとリゾルバー」を処理するために遅延 jQuery を拡張するスニペットが見つかりました。

$.extend({
  StatelessDeferred: function () {
    var doneList = $.Callbacks("memory"),
      promise = {
        done: doneList.add,

        // Get a promise for this deferred
        // If obj is provided, the promise aspect is added to the object
        promise: function (obj) {
          var i,
            keys = ['done', 'promise'];
          if (obj === undefined) {
            obj = promise;
          } else {
            for (i = 0; i < keys.length; i += 1) {
              obj[keys[i]] = promise[keys[i]];
            }
          }
          return obj;
        }
      },
      deferred = promise.promise({});

   deferred.resolveWith = doneList.fireWith;
    deferred.resolve = doneList.fire;

    // All done!
    return deferred;
  }
});
于 2013-06-03T09:29:50.820 に答える