2014-02-24 99 views
19

我需要一个额外的参数传递给一个jquery Ajax调用的.done承诺回调:额外的参数传递到jQuery的AJAX承诺回调

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

标准的回调,会是这样:

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

但我需要一个额外的参数传递给我的回调,像这样:

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

我该怎么做?

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

回答

21

我发现它真的很容易,包括一个新的水平间接的,就像这样:

var extraParam = 'xyz'; 

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

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

当然,这也可以做到,如果承诺被存储在一个变量中,例如,一个由函数返回,这样的:

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,你会得到一个新的功能。传递给绑定的第一个参数将在返回函数体内变成this。附加参数将为前加为原始参数。

以下代码显示如何使用绑定。对于TL; DR看的代码

// To show the results in the page 
 
var $log = $('#log'); 
 
var log = function(text) { 
 
    $log.append(text+'<br/>'); 
 
}; 
 

 
// 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('<b>trigger</b> invoked'); 
 
    var deferred = $.Deferred(); 
 
    setTimeout(function() { 
 
     log('<b>trigger</b> 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('<b>extraParams</b> extra1:' + extra1); 
 
    log('<b>extraParams</b> extra2:' + extra2); 
 
    log('<b>extraParams</b> a:' + a); 
 
    log('<b>extraParams</b> 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') 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="log"> 
 
</div>

最后两个街区