Запретить назначенный обработчик успеха в зависимости от содержимого загруженного файла - PullRequest
2 голосов
/ 27 марта 2012

Я пытаюсь найти способ предотвратить мой обычный обработчик успеха, если какое-либо утверждение верно, например,

$.ajax({
    url: ...
    success: function( response ) {
        if ( response.success ) {
            // do success
        } else {
            // do fail, maybe login timeout
        }
    }
});

Это простой способ. Очень просто иметь объект с success = true/false.

Но есть ли способ предотвратить запуск моего обработчика успеха, если утверждение верно, например,

$.ajax({
    url: ...
    success: function( response ) {
        // do success
    }
});
$.ajaxFireBeforeAllOtherSuccessHandler(function(response) {
    return response.success;
});

, а затем это имеет $.ajaxFireBeforeAllOtherSuccessHandler (псевдо-имя) для запуска перед всеми другими обработчиками успеха и определения, будут ли запущены другие.

Я знаю, что могу установить statusCode запроса, может быть, 401, а затем получить главный элемент управления, используя $.ajaxSetup:

$.ajaxSetup({
    statusCode: {
        401: function() {
            // this do fail
        }
    }
});

Но сейчас это невозможно для меня!

Другой способ - использовать метод проверки, в который вы добавляете обратный вызов:

$.ajax({
    url: ...
    success: function() { checkAjax(arguments, function() {
        // do success
    }); }
});
function checkAjax( a, c ) {
    return a[0].success && c.apply($, a);
}

Есть ли способ предотвратить назначенный обработчик успеха в зависимости от содержимого загруженного файла?

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Я нашел jQuery.ajaxPrefilter

Ведьма позволяет вам захватывать все Ajax-вызовы до запуска оригинального обработчика успеха. Затем вы можете переписать обработчик и выполнить тест, чтобы увидеть, хотите ли вы запустить оригинал:

jQuery.ajaxPrefilter(function( opts ) {
    var _success = opts.success; // Copy original
    opts.success = function( r ) { // Overwrite original

        var args = [].slice.call(arguments), // Convert arguments to a native array 
            isTrue = !(r.success === false); // Do my testing here

        if ( isTrue ) {
            _success.apply( this, args ); // Fire original with the right context and arguments
        } else {
            // Do my alert thing in here
        }
    };
});

Спасибо за вашу помощь @ jfriend00

2 голосов
/ 27 марта 2012

Если вы ищете глобальный способ решить, вызывать ли обычный обработчик успеха, то, я думаю, вы могли бы сделать что-то вроде этого:

Установите глобальный обработчик ajaxSuccess , как описано здесь.Затем создайте свое собственное свойство в объекте настроек ajax с именем что-то вроде mySuccess: fn и поместите туда свой обработчик успеха вместо обычного success: fn, чтобы jQuery не вызывал его автоматически.Затем в обработчике ajaxSuccess вы можете опросить объект xhr и решить, хотите ли вы продолжать вызывать функцию успеха.Если вы это сделаете, то можете заглянуть в объект настроек, чтобы получить обработчик mySuccess и вызвать его.

В чуть менее сложном методе вы могли бы просто определить вспомогательную функцию, которую вы бы установили для обычногообработчик успеха.В этом обработчике успеха вы проверяли бы значение ответа, и если это было то, что вы искали, то вы могли бы вызвать функцию mySuccess для объекта настроек.

...