2012-02-02 5 views
5

Я довольно новичок в jQuery, и я пытаюсь вызвать две функции на успешном ajax (так как в документации говорится, что с обратным вызовом 1.5 можно взять массив функций) ,jQuery - передать массив функций для обратного вызова ajax

Если я это сделаю, то все работает отлично:

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

Что мне нужно сделать, чтобы передать массив функций? Если бы я попробовать следующее, я получаю «неперехваченным TypeError: Не удается прочитать свойство„длина“неопределенной» ошибки в консоли:

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

Я не смог найти каких-либо примеров этой функции используются. Спасибо заранее, и извините, если это глупо.

+2

Если 'Foo' возвращает функцию, то это' успех: Foo (данных) 'Безразлично» t, а также вы можете подумать. Вы вызываете 'foo' немедленно, а не передаете его как обратный вызов. –

ответ

13

Там нет необходимости для массива, вы можете использовать отложенный синтаксис, который также был введен в JQuery 1.5 :

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

Это, как правило, чище и гораздо более расширяемой, чем передача функций обратного вызова в качестве параметров $.ajax и родственников.

Из $.ajax() documentation:

The jqXHR objects returned by $.ajax() as of jQuery 1.5 implement the Promise interface, giving them all the properties, methods, and behavior of a Promise (see Deferred object for more information). For convenience and consistency with the callback names used by $.ajax() , jqXHR also provides .error() , .success() , and .complete() methods. These methods take a function argument that is called when the $.ajax() request terminates, and the function receives the same arguments as the correspondingly-named$.ajax()callback. This allows you to assign multiple callbacks on a single request, and even to assign callbacks after the request may have completed. (If the request is already complete, the callback is fired immediately.)

[но смотри параграф после, где он объясняет, как .success, .error и .complete теперь устарели и заменены .done, .fail и .always]

+0

Это работает. Пропускает ли $ .done (data, textStatus, jqXHR) foo и bar, как и успех? Я мало знаю о Deferred – MJS

+0

@MJS да, это так - я добавлю текст. – Alnitak

+0

Просто примечание для всех, кто имеет дело с этим: документация показывает, что обратные вызовы выполняются в последовательном порядке. –

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 callback позволяют это).


Вы сказали, что это работает отлично:

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

, но это не так. То, что это делает, сразу вызывает функцию foo, а затем присваивает возвращаемое значение этой функции свойству success опций, которые вы передаете ajax. Если вы не используете foo для создания и возврата функции, используемой в качестве обратного вызова, это не то, что вы хотите сделать.

Важно понимать разницу между , вызывая функцию и используя ссылку на нее. Если у вас есть parens после имени функции (с или без аргументов в них), вы получите , вызывая. Если у вас просто есть имя, вы имеете в виду его. Например:

var f = foo(); // CALLs `foo` and assigns return value to `f` 
var f = foo; // Assigns a reference to `foo` to `f` 
+0

+1 Очень тщательно. –

+0

Это прекрасно. Я думаю, что мой JS был кэширован, и именно поэтому он работал с моим кодом borked. Я отмечу это как ответ через 15 минут. Спасибо за тщательный ответ! – MJS

+0

@amnotiam за исключением полного отказа от использования синтаксиса отложенного объекта, который теперь является предпочтительным способом выполнения обратных вызовов AJAX ... – Alnitak

0

Почему вы не звоните одна функция, которая вызывает другие два:

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

function foo_bar(data) 
{ 
    foo(data); 
    bar(data); 
{ 
1

при написании

success : [foo(data), bar(data)] 

Вы a повторно на самом деле оценки Foo и бар функции (возможно с пустым аргументом)

вам нужно написать

success : [foo, bar] 
Смежные вопросы