簡體   English   中英

jQuery-將函數數組傳遞給Ajax成功回調

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

請注意,在第二篇文章中,我沒有調用 foobar ,而是在數組中列出了函數引用(正如您所說的那樣,自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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM