2012-08-06 50 views
3

我在想如何将参数传递给由jQuery的promise对象触发的回调函数。我的方法,它调用了ajax,然后承诺的方法是这样的:带参数的jQuery Promise回调

var formObject = { 
    call : function(thisForm, thisUrl, thisArray, thisCallback) { 
     "use strict"; 
     var thisMethod = thisForm.attr('method').toUpperCase(); 
     var thisPromise = $.ajax({ 
      type : thisMethod, 
      url : thisUrl, 
      dataType : 'json', 
      data : thisArray, 
      cache : false 
     }); 
     thisPromise.done(thisCallback(data, textStatus, jqXHR)); 
     thisPromise.fail(formObject.topError(jqXHR, textStatus, errorThrown)); 
    } 
}; 

中所做的参数()和失败()方法是不正确的 - 但是这正是我试图弄清楚。

回答

2

没有必要提供额外的倒闭 - 下面的线应该能正常运行:

thisPromise.done(thisCallback); 
thisPromise.fail(formObject.topError.bind(formObject)); 

done回调将通过$.ajax提供的data, textStatus, jqXHR参数。这一行只是直接注册提供的回调函数。

fail回调同样会得到正确的参数,只是我用.bind这里来确保this正确设置为formObject。如果此代码将用于ES5之前的浏览器,则只需安装垫片.bind - 上面链接的Mozilla网站上有一个。

+0

谢谢Alnitak - 这一个会好吗? :https://gist.github.com/3140164 – 2012-08-06 08:24:29

+0

@SpencerMark是的,那应该没问题。 – Alnitak 2012-08-06 08:25:14

1

尝试写而不是

thisPromise.done(function(data, textStatus, jqXHR) { 
    thisCallback(data, textStatus, jqXHR); 
}); 
thisPromise.fail(function(jqXHR, textStatus, errorThrown) { 
    formObject.topError(jqXHR, textStatus, errorThrown); 
}); 

包装函数里面两个回调

+0

这不会工作 – Alnitak 2012-08-06 07:45:42

+0

@alnitak,前提是我对'thisCallback'和'formObject.topError'存在一无所知......为什么它不应该工作?如果这是由于缺乏参数,我刚刚更新了我的答案:) – fcalderan 2012-08-06 07:48:43

+0

是的,这是缺乏参数。参数在OP代码中给出。你当然应该注意到提供的函数正在被传递_exactly_与回调相同的参数... – Alnitak 2012-08-06 07:54:06

1

使用闭:

var formObject = { 
    call : function(thisForm, thisUrl, thisArray, thisCallback) { 
     "use strict"; 
     var thisMethod = thisForm.attr('method').toUpperCase(); 
     var thisPromise = $.ajax({ 
      type : thisMethod, 
      url : thisUrl, 
      dataType : 'json', 
      data : thisArray, 
      cache : false 
     }); 
     thisPromise.done(function(data, textStatus, jqXHR) { 
       thisCallback(/* additional parameters*/) 
     }); 
.......................... 
    } 
};