将额外参数传递给jquery ajax promise回调

我需要将一个额外的参数传递给jquery ajax调用的.done promise回调:

 $.post("MyUrl", JSON.stringify(data)) .done(onMyUrlLoaded); 

标准回调,如下所示:

 function onMyUrlLoaded(data, textStatus, jqXHR) { /* function code */ }; 

但我需要将一个额外的参数传递给我的回调,如下所示:

 function onMyUrlLoaded(data, textStatus, jqXHR, extraParam) { /* code */ }; 

我该怎么做?

注意:这个问题不重复,因为它特别关于promise回调。 除此之外,这个问题比被称为复制的问题还要早两年,并给出了一个更彻底的答案,以及一个关于承诺的具体答案。

我发现包含一个新的间接级别非常简单,就像这样:

 var extraParam = 'xyz'; $.post("MyUrl", JSON.stringify(data)) .done(function(a,b,c) { onMyUrlLoaded(a, b, c, extraParam); }); 

这样,除了三个标准参数之外,回调将接收extraParam。

当然,如果promise存储在一个变量中,例如一个函数返回的变量,也可以这样做,如下所示:

 function getUrl() { // some code ... var promise = $.post("MyUrl", JSON.stringify(data)); return promise; } 

这可以像这样调用和使用:

 var promise = getUrl(); var extraParam = 'xyz'; promise.done(function(a,b,c) { onMyUrlLoaded(a, b, c, extraParam); }); 

执行此操作的语法较短,包括使用bind 。

在函数中调用bind时,会得到一个新函数。 传递给bind的第一个参数将成为返回函数体内的这个参数。 附加参数将添加到原始参数之前。

以下代码显示了如何使用bind。 对于TL; DR查看最后两个代码块

 // To show the results in the page var $log = $('#log'); var log = function(text) { $log.append(text+'
'); }; // This returns a promise, and resolves it after the specified // timeout. This behaves like a jQuery ajax call (but for the // provided timeout) var trigger = function(timeout) { log('trigger invoked'); var deferred = $.Deferred(); setTimeout(function() { log('trigger resolving promise'); deferred.resolve('A','B'); }, timeout); return deferred; }; // This is the function we want to invoke // The promise returns a and b - the extra params // must be supplied in some way var extraParams = function(extra1, extra2, a, b) { log('extraParams extra1:' + extra1); log('extraParams extra2:' + extra2); log('extraParams a:' + a); log('extraParams b:' + b); }; // Doing it using indirection trigger(500).then(function(a,b) { extraParams('extra1','extra2',a,b); }); // Doing it using bind() trigger(1200).then( extraParams.bind(this,'extra1','extra2') );