[英]JQuery Ajax success callback not work when building array of Ajax calls
[英]jQuery - pass array of functions to ajax success callback
我是jQuery的新手,我试图在成功的Ajax上调用两个函数(因为文档从1.5开始说,成功的回调可以使用一系列函数)。
如果执行此操作,则一切正常:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : foo(data)
});
我需要做什么来传递函数数组? 如果尝试以下操作,则会在控制台中收到“未捕获的TypeError:无法读取未定义的属性'length'的信息”错误:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : [foo(data), bar(data)]
});
我找不到使用此功能的任何示例。 在此先感谢您,如果这很愚蠢,请多谢。
不需要数组,您可以使用jQuery 1.5中也引入的延迟语法:
$.ajax(...).done(foo).done(bar);
与将回调函数作为参数传递给$.ajax
和亲戚相比,此方法通常更干净,更可扩展。
从$.ajax()
文档中 :
$.ajax()
从jQuery 1.5开始由$.ajax()
返回的jqXHR对象实现Promise接口,为它们提供Promise的所有属性,方法和行为(有关更多信息,请参见Deferred对象 )。 为了方便和与$.ajax()
使用的回调名称保持一致,jqXHR还提供了.error()
.success()
和.complete()
方法。 这些方法采用一个函数参数,该参数在$.ajax()
请求终止时被调用,并且该函数接收与相应名称的$.ajax()
回调 相同的参数 。 这使您可以在单个请求上分配多个回调 , 甚至可以在请求完成后分配回调 。 (如果请求已完成,则立即触发回调。)
[但看后的一段,它解释了如何.success
, .error
和.complete
现在已被弃用,取而代之的.done
, .fail
和.always
]
您要做的是:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : function(data) {
foo(data);
bar(data);
}
});
或这个:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : [foo, bar]
});
请注意,在第二篇文章中,我没有调用 foo
和bar
,而是在数组中列出了函数引用(正如您所说的那样,自1.5版开始,jQuery的ajax回调选项允许这样做)。
您已经说过,这很好用:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : foo(data)
});
但事实并非如此。 这样做是立即调用 foo
函数,然后将该函数的返回值分配给要传递给ajax
的选项的success
属性。 除非您使用foo
来构建并返回用作回调的函数,否则这不是您想要的。
重要的是要了解调用函数和使用对函数的引用之间的区别。 如果在函数名称后面有括号(在函数名称中有或没有参数),则在调用它。 如果只是名字,就是指它。 例如:
var f = foo(); // CALLs `foo` and assigns return value to `f`
var f = foo; // Assigns a reference to `foo` to `f`
写作时
success : [foo(data), bar(data)]
您实际上正在评估foo和bar函数(可能带有null参数)
你需要写
success : [foo, bar]
为什么不调用一个调用其他两个函数:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : foo_bar(data)
});
function foo_bar(data)
{
foo(data);
bar(data);
{
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.