为什么在调用多次设置新$ .Deferred的函数时,我的延迟对象设置为已解决而不是挂起?

我试图让jQuery deferred工作并遇到一些问题。

我的系统使用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); }; 

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


我需要做些什么才能让它发挥作用? 是不是, 新的创造了一个新的对象,我可以解决? 我是否必须以某种方式删除/删除以前的resolved.deferred对象才能使其正常工作?

谢谢!

找到一个扩展jQuery延迟处理“多个延迟的setter和resolvers”的片段:

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