0

我正在尝试让 jQuerydeferred工作并且遇到了一些问题。

我的系统postMessage用于在网站上的沙盒区域之间传递消息。因此,当我从这样的沙盒区域请求服务时:

// 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);
};

一切正常,我可以请求我的沙盒服务,运行它,发布结果并检索相应的回调:

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每次请求服务时都会生成一个新的延迟,我可以解决它来运行我的回调函数。

问题
我需要做什么才能使其正常工作?是不是,new创建了一个我可以解决的对象?我是否必须以某种方式删除/删除以前的 resolved.deferred 对象才能使其工作?

谢谢!

4

1 回答 1

0

找到了一个扩展 jQuery deferred 以处理“多个延迟设置器和解析器”的片段:

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