我發現它真的很容易,包括一個新的水平間接的,就像這樣:
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>
最後兩個街區