【问题标题】:Passing arguments to $.then function将参数传递给 $.then 函数
【发布时间】:2013-07-23 14:53:47
【问题描述】:

我有类似以下的内容:

$(".remove-item").click(function(e) {
    e.preventDefault();

    var url = $(this).attr('href');
    var id = $(this).data("id");
    $.when(removeItem(url))
      .then(removeItemResponse(id));
});

var removeItemResponse = function(data, id) {
   console.log(data);
   console.log(id);
};

var removeItem = function(url) {
  return $.post(url);
};

上述内容不起作用,因为在处理 ajax 请求后,我在日志中什么也没有得到,而且我知道这与我如何处理 removeItemResponse 中的参数有关。我需要使用从 ajax 帖子返回的数据,还需要传入我在 click 函数中检索到的 id。

【问题讨论】:

  • removeItem 定义在哪里?
  • 你已经向我们展示了除了 removeItem 之外的所有东西,你能做到吗?
  • 我认为removeItem 不相关。知道它是如何定义的将无助于将 id 传递给 .then 回调 fn。
  • 我添加了 removeItem 功能,但我认为这并不重要。

标签: jquery jquery-deferred


【解决方案1】:

removeItemResponse(id) 正在立即执行该函数,并且您没有传递第一个延迟的结果。试试这个:

.then(function(data) { removeItemResponse(data, id) });

done() 也可以在这里使用:

.done(function(data) { removeItemResponse(data, id) });

您可以像这样简化和处理故障:

removeItem(url)
    .done(function(data) { removeItemResponse(data, id) });
    .fail(function(result) { /* do something else */ });

【讨论】:

    【解决方案2】:

    您在何时/那时滥用,它们不适用于此处。只需在从removeItem 返回的承诺上使用.done。它将传递 AJAX 请求的结果(假设它返回由 $.ajax 调用等返回的承诺),然后您可以将该结果和 id 传递给您的处理函数:

    removeItem(url).done(function (data) {
      removeItemResponse(data, id);
    });
    

    【讨论】:

    • 我想要一个单独的函数来处理非 200 状态响应,并且它正在这方面工作。我是如何“滥用”它的?
    • 何时/然后有特定目的,这不是它。您发布的代码可以通过单个.done 完成。
    • 谢谢,有道理。
    猜你喜欢
    • 2014-07-13
    • 1970-01-01
    • 1970-01-01
    • 2015-12-30
    • 2013-01-27
    • 2014-05-22
    • 2021-04-18
    相关资源
    最近更新 更多