jQuery - 将函数数组传递给ajax成功回调

时间:2012-02-02 22:31:55

标签: javascript jquery

我对jQuery很新,我试图在成功的ajax上调用两个函数(因为文档说1.5成功回调可以使用一系列函数)。

如果我这样做,一切正常:

$.ajax({
    url : sJSONFilePath,
    dataType : 'json',
    success : foo(data)
});

传递一系列函数需要做什么?如果我尝试以下操作,我会在控制台中收到“未捕获的TypeError:无法读取未定义的属性'长度”错误:

$.ajax({
    url : sJSONFilePath,
    dataType : 'json',
    success : [foo(data), bar(data)]
});

我无法找到正在使用此功能的任何示例。提前谢谢,如果这是愚蠢的话,对不起。

4 个答案:

答案 0 :(得分:13)

不需要数组,你可以使用jQuery 1.5中引入的延迟语法:

$.ajax(...).done(foo).done(bar);

这通常比将回调函数作为参数传递给$.ajax和亲属更清晰,更具可扩展性。

来自$.ajax() documentation

  

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

请注意,在第二个中,我不是调用 foobar,我列出了数组中的函数引用(因为正如你所说,从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);
{