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

Jot*_*aBe 22 javascript ajax jquery promise

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

$.post("MyUrl", JSON.stringify(data))
        .done(onMyUrlLoaded);
Run Code Online (Sandbox Code Playgroud)

标准回调,如下所示:

function onMyUrlLoaded(data, textStatus, jqXHR) { /* function code */ };
Run Code Online (Sandbox Code Playgroud)

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

function onMyUrlLoaded(data, textStatus, jqXHR, extraParam) { /* code */ };
Run Code Online (Sandbox Code Playgroud)

我该怎么做?

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

Jot*_*aBe 26

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

var extraParam = 'xyz';

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

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

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

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

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

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

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

当您调用bind函数时,您将获得一个新函数.传递给bind的第一个参数将变为this返回函数的主体内部.附加参数将添加到原始参数之前.

以下代码显示了如何使用bind.对于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')
);
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log">
</div>
Run Code Online (Sandbox Code Playgroud)