2014-02-24 82 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>

最後兩個街區