Javascript 为什么在多次调用设置新$.deferred的函数时,我的deferred对象设置为resolved而不是pending?

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

我试图让jQuery工作,但遇到了一些问题

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