2013-06-26 2 views
1

Что я хочу сделать - это функция успеха по умолчанию, которая будет обрабатываться всеми запросами, а затем конкретная функция с материалами для отдельных вызовов.Функция успеха jquery ajax по умолчанию с настраиваемой функцией

Что-то вроде

function handleResponse(data, func){ 
    if(data.error){ 
     display error information 
    }else{ 
     func(data) 
    } 
} 

$.ajax({ 
    success: handleResponse(data, function(){ 
     Individual request callback function 
    }) 
}); 

Не совсем уверен, если это будет работать сама по себе, но я пишу это, чтобы вы могли понять логику того, что я стремлюсь делать. Я хочу спросить, есть ли способ передать эту функцию handleResponse в $.ajaxSetup или что-то, чтобы я мог просто обрабатывать ответ ajax, как обычно, с помощью одной анонимной функции и вызывать автоматически handleResponse?

Спасибо!

ответ

2

Когда JQuery вызывает обработчик успеха он не ожидает, чтобы передать его функции, как это, но вы можете сделать что-то вроде следующего:

function makeResponseHandler(func){ 
    return function(data) { 
     if(data.error){ 
      // display error information 
     }else{ 
      func(data); 
     } 
    }; 
} 

$.ajax({ 
    success: makeResponseHandler(function(){ 
     //Individual request callback function 
    }) 
}); 

линии с success: ... сразу вызывает функцию makeResponseHandler(), передавая ее индивидуальную анонимную функцию. Затем функция makeResponseHandler() возвращает другую функцию, и именно эта функция становится обратным вызовом.

+0

Удивительный! Благодаря! : P Подождите некоторое время, прежде чем я приму ответ. –

+0

'success' функции _so_ 2010 ;-) – Alnitak

0

попробовать

$.ajax({ 
    url: "/path/", 
    success: handleResponse 
}); 
+0

Я не понимаю, как это обрабатывает отдельные анонимные функции:/ –

0

Почему нет?

$.ajax({ 
    url: "/path/", 
    success: function(data){ 
     handleResponse(data, function(){ 
     }); 
    } 
}); 

function handleResponse(data, callback){ 
    if(data.error){ 
     display error information 
    }else{ 
     callback.call(); 
    } 
} 
+0

' callback.call() '? Вы знаете, что можете просто сказать 'callback()'? – nnnnnn

2

ИМХО, лучший способ сделать это состоит в использовании «отсроченные» объекты, наряду с функцией, которая будет предварительной обработки ваши результаты AJAX, прежде чем передать их в свои собственные функции обратного вызова:

function errorCheck(data) { 
    if (data.error) { 
     // display errors 
     ... 
     return $.Deferred().reject(); // "fake" a failure 
    } else { 
     return arguments; 
    } 
} 

с использованием:

$.ajax(...).then(errorCheck).done(function(data) { 
    // normal callback function processing 
    ... 
}).fail(function() { 
    // called if AJAX fails, or if data.error is set 
    ... 
}); 

Это позволяет решать на основе каждого вызова, хотите ли вы использовать errorCheck логика или нет , А также позволяет использовать errorCheck с $.get, $.post и т.д.

+1

Это выглядит настолько сложным, что вы делаете что-то простое:/+ rep, конечно, но я предпочел бы пойти с простотой, хотя это может быть 2010: D –

+0

@php_nub_qq на самом деле я просто упростил его - я нашел правильный путь make '. then' вернуть« отказ », чтобы заменить« успех ». – Alnitak

0

Я не думаю, что ничего подобного уже существует, но вы можете qrap вызов Ajax в чем-то вроде

function doAjax(url, callback) { 
    $.ajax({ 
    url: "/path/", 
    success: function (...) { 
     handleResponse(); 
     callback(); 
    } 
    }); 
} 

doAjax (»/path ", function() {..});

+0

Я думаю, что это может стать ужасно болезненным, если мне нужно использовать больше свойств '$ .ajax' локально. –

0
$(document).ajaxcomplete(function(){ 
//This function is executed on every ajax call completion. 
}); 

Тогда вы просто сделать свой запрос, как бы вы ...

$.ajax({ 
    url: "/path/", 
    success: function(){ 
     //My handler for this call. 
    } 
}); 

Вы можете прочитать больше на http://api.jquery.com/category/ajax/global-ajax-event-handlers/

+0

Да, но в этом случае функция успеха будет вызвана независимо от того, какой ответ. У меня есть настраиваемая обработка ошибок, которая отправляет свойство ошибки объекта ответа, если что-то пошло не так, и если оно присутствует, мне нужно прервать обратный вызов –

+0

, а затем заменить ajaxcomplete для ajaxsuccess ... Я сам использую ajaxcomplete для отслеживания ошибок и отправки их где-нибудь иначе, но вам доступны несколько вариантов. – Salketer

+0

@php_nub_qq FWIW, службы стиля RESTful _should_ указывают на ошибку с кодом ответа стиля «4xx», вызывая путь «Ошибка AJAX», а не «2xx», указывающий «успех». – Alnitak