jQuery / Ajax-$ .ajax()将参数传递给回调-使用好的模式?


73

我从以下代码开始:

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)
   });
}  

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



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

Answers:


96

像这样...

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

对您的评论的答案:使用匿名函数是否会影响性能?


3
啊哈+1。您是否为在任何地方创建匿名函数付出任何性能代价?
BuddyJoe

2
而且我想那真的会是...。成功:function(xml){rssToTarget(xml,elem); }
BuddyJoe

如果将$.ajax调用包装在一个循环中,则此方法将为function(xml) { ... }每个循环创建新函数(),从而占用更多内存。
2015年

30

如果您在rssToTarget函数中创建一个闭包,那么您想使用的模式就可以工作:

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)执行时,element参数存储在闭包中,并返回回调函数,等待执行。


-1您不能为返回函数的函数设置成功。
乔什·斯托多拉

我忘记添加“但需要一个参数”
Josh Stodola

3
当然你可以返回一个函数检查代码运行!jsbin.com/anepo/edit
基督教C. SALVADO

3
返回的匿名函数具有输入参数... JavaScript函数功能允许您执行此操作以及使用函数执行更多操作……
Christian C.Salvadó09年

1
这个答案比公认的答案更忠实地再现了OP想要实现的目标。
sage88
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.