首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >将额外的参数传递给jquery ajax promise回调

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

Stack Overflow用户
提问于 2014-02-24 18:33:43
回答 1查看 15.9K关注 0票数 26

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

代码语言:javascript
复制
$.post("MyUrl", JSON.stringify(data))
        .done(onMyUrlLoaded);

标准的回调应该是这样的:

代码语言:javascript
复制
function onMyUrlLoaded(data, textStatus, jqXHR) { /* function code */ };

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

代码语言:javascript
复制
function onMyUrlLoaded(data, textStatus, jqXHR, extraParam) { /* code */ };

我该怎么做呢?

注意:这个问题不是重复的,因为它是专门关于promise回调的。此外,这个问题比据说重复的问题早了两年,并且给出了一个更彻底的答案,以及关于承诺的具体答案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-02-24 18:33:43

我发现包含一个新的间接级别真的很容易,就像这样:

代码语言:javascript
复制
var extraParam = 'xyz';

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

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

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

代码语言:javascript
复制
function getUrl() {
  // some code ...
  var promise = $.post("MyUrl", JSON.stringify(data));
  return promise;
}

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

代码语言:javascript
复制
var promise = getUrl();
var extraParam = 'xyz';
promise.done(function(a,b,c) { onMyUrlLoaded(a, b, c, extraParam); });

有一种更短的语法可以做到这一点,这就是使用bind

当你在一个函数中调用bind时,你会得到一个新函数。传递给bind的第一个参数将成为返回函数体中的this。附加的参数将在原始参数的前面加上。

下面的代码展示了如何使用bind。对于TL;DR,请查看最后两个代码块

代码语言:javascript
复制
// 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')
);
代码语言:javascript
复制
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="log">
</div>

票数 28
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21985201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档