Javascript 为什么在多次调用设置新$.deferred的函数时,我的deferred对象设置为resolved而不是pending?
我试图让jQuery工作,但遇到了一些问题 我的系统使用Javascript 为什么在多次调用设置新$.deferred的函数时,我的deferred对象设置为resolved而不是pending?,javascript,jquery,promise,deferred,resolve,Javascript,Jquery,Promise,Deferred,Resolve,我试图让jQuery工作,但遇到了一些问题 我的系统使用postMessage在网站上的沙盒区域之间传递消息。因此,当我从沙盒区域请求服务时,如下所示: // on click of button foo.requestService(options, function (response) { $("#c").val(response); // set value of input button } 在内部,每次单击按钮并请求服务时,我都会创建一个新的。延迟,如下所示: that.r
postMessage
在网站上的沙盒区域之间传递消息。因此,当我从沙盒区域请求服务时,如下所示:
// on click of button
foo.requestService(options, function (response) {
$("#c").val(response); // set value of input button
}
在内部,每次单击按钮并请求服务时,我都会创建一个新的。延迟,如下所示:
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]);
};
我的问题是,尽管每次请求服务时我都要创建一个**新**$.Deferred
,但我的Deferred对象只在第一次运行时才被设置为resolved
,从而阻止任何进一步的函数调用返回结果
我以为每次请求服务时,new$.Deferred
都会生成一个新的Deferred,我可以解析它来运行回调函数
问题我需要做些什么才能让它工作?是不是new创建了一个new对象,我可以解析它?我是否必须以某种方式删除/删除以前的resolved.deferred对象才能使其工作
谢谢 找到一个扩展jQuery deferred以处理“多个延迟设置程序和解析程序”的代码段:
$.extend({
无状态延迟:函数(){
var doneList=$.Callbacks(“内存”),
承诺={
完成:doneList.add,
//得到延期付款的承诺
//如果提供了obj,承诺方面将添加到对象中
承诺:功能(obj){
var i,
keys=['done','promise'];
如果(obj==未定义){
obj=承诺;
}否则{
对于(i=0;i
我只能假设priv
是一个无所不知的天才对象!
$.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;
}
});