【问题标题】:jQuery / Ajax - $.ajax() Passing Parameters to Callback - Good Pattern to Use?jQuery / Ajax - $.ajax() 将参数传递给回调 - 使用好的模式?
【发布时间】:2010-11-14 17:05:38
【问题描述】:

我开始使用的 JavaScript 代码:

function doSomething(url) {  
   $.ajax({
      type: "GET",  
      url: url,  
      dataType: "xml",  
      success: rssToTarget  
   });  
}    

我想使用的模式:

//where elem is the target that should receive new items via DOM (appendChild)
function doSomething(url, elem) {
   $.ajax({
      type: "GET",
      url: url,
      dataType: "xml",
      success: rssToTarget(elem)
   });
}  

我认为我不能让回调以这种方式工作,对吧?什么是正确的模式?我不想使用全局变量来临时保存 elem 或 elem 名称。

【问题讨论】:

  • 供将来参考:您需要将回调函数 (rssToTarget) 存储在您传递给 $.ajax() 的对象文字的 success 属性中,因此 jQuery 可以在AJAX 请求完成。通过将(elem) 添加到函数名称的末尾,您会错误地调用rssToTarget 并将其返回值存储在success 中。在 JS 中,在函数名末尾添加括号会调用它。

标签: javascript jquery ajax callback


【解决方案1】:

像这样……

function doSomething(url, elem) {
  $.ajax({
     type: "GET",
     url: url,
     dataType: "xml",
     success: function(xml) {
       rssToTarget(xml, elem);
     }
  });
}

回复您的评论:Does use of anonymous functions affect performance?

【讨论】:

  • 啊哈+1。您是否为到处创建匿名函数付出任何性能代价?
  • 我猜它真的会是.... 成功:function(xml) { rssToTarget(xml, elem); }
  • 如果将$.ajax 调用包装在一个循环中,这种方法将为每个循环创建新函数(function(xml) { ... }),从而消耗更多内存。
【解决方案2】:

如果您在 rssToTarget 函数中创建 closure,您想使用的模式可能会起作用:

function rssToTarget(element) {
  return function (xmlData) {
    // work with element and the data returned from the server
  }
}

function doSomething(url, elem) {
    $.ajax({ type: "GET",
         url: url,
         dataType: "xml",
         success: rssToTarget(elem)
       });
}

rssToTarget(elem)执行时,元素参数存入closure,回调函数返回,等待执行。

【讨论】:

  • -1 您不能将成功设置为返回函数的函数。
  • 我忘了加“但需要参数”
  • 当然可以返回一个函数检查代码运行! jsbin.com/anepo/edit
  • 返回的匿名函数有一个输入参数...JavaScript 函数功能允许您使用函数执行此操作以及更多功能...
  • 这个答案比公认的答案更忠实地再现了 OP 想要实现的目标。
【解决方案3】:

开发Ajax request settings context怎么样?

function doSomething(url, elem) {
   $.ajax({
      type: "GET",
      url: url,
      dataType: "xml",
      success: rssToTarget,
      elem: elem               // <- add as settings argument
   });
}

rssToTarget(ans) {
    elem = this.elem;          // <- get it back using "this"
}

默认情况下,回调上下文是$.ajaxSettings 和传递给$.ajax 的设置的合并。因此,如果您在 $.ajax 设置中添加字段,它们将进入回调上下文。也就是说,您可以使用 this 从上下文中检索它们。

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 2014-03-25
    相关资源
    最近更新 更多