![](/img/trans.png)
[英]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.