我对jQuery很新,我试图在成功的ajax上调用两个函数(因为文档说1.5成功回调可以使用一系列函数)。
如果我这样做,一切正常:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : foo(data)
});
传递一系列函数需要做什么?如果我尝试以下操作,我会在控制台中收到“未捕获的TypeError:无法读取未定义的属性'长度”错误:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : [foo(data), bar(data)]
});
我无法找到正在使用此功能的任何示例。提前谢谢,如果这是愚蠢的话,对不起。
答案 0 :(得分:13)
不需要数组,你可以使用jQuery 1.5中引入的延迟语法:
$.ajax(...).done(foo).done(bar);
这通常比将回调函数作为参数传递给$.ajax
和亲属更清晰,更具可扩展性。
jQuery 1.5中
$.ajax()
返回的jqXHR对象实现了Promise接口,为它们提供了Promise的所有属性,方法和行为(有关更多信息,请参阅Deferred object)。为了方便和与$.ajax()
使用的回调名称保持一致,jqXHR还提供.error()
,.success()
和.complete()
方法。这些方法采用在$.ajax()
请求终止时调用的函数参数,函数接收与相应命名的$.ajax()
回调相同的参数。此允许您在单个请求上分配多个回调,甚至可以在请求完成后分配回调。 (如果请求已经完成,则立即触发回调。)
[但请参阅后面的段落,其中说明了.success
,.error
和.complete
现已弃用并替换为.done
,.fail
和{ {1}}]
答案 1 :(得分:5)
你做的是这个:
$.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
函数,然后将该函数的返回值分配给您传递给success
的选项的ajax
属性}。除非你使用foo
来构建并返回一个用作回调的函数,否则这不是你想要做的。
理解调用函数和使用对它的引用之间的区别非常重要。如果你在函数名后面有parens(包含或不包含参数),你就调用它。如果你有这个名字,你就是指它。 E.g:
var f = foo(); // CALLs `foo` and assigns return value to `f`
var f = foo; // Assigns a reference to `foo` to `f`
答案 2 :(得分:1)
写作时
success : [foo(data), bar(data)]
你实际上正在评估foo和bar函数(可能带有null参数)
你需要写
success : [foo, bar]
答案 3 :(得分:0)
为什么不调用一个调用另外两个函数的函数:
$.ajax({
url : sJSONFilePath,
dataType : 'json',
success : foo_bar(data)
});
function foo_bar(data)
{
foo(data);
bar(data);
{