我发现包括一个新的间接级别真的很容易,就像这样:
var extraParam = 'xyz';$.post("MyUrl", JSON.stringify(data)) .done(function(a,b,c) { onMyUrlLoaded(a, b, c, extraParam); });这样,除了三个标准参数外,回调还将接收extraParam。
当然,如果将promise存储在变量中(例如,由函数返回的变量),也可以执行以下操作:
function getUrl() { // some pre ... 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的第一个参数将成为
thisreturn函数的主体。其他参数将被 前置 到原来的参数。
以下代码显示了如何使用绑定。对于TL; DR,请看最后两个代码块
// To show the results in the pagevar $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 wayvar 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 indirectiontrigger(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>


