Как отменить jQuery.ajax в зависимости от ответа? - PullRequest
0 голосов
/ 28 февраля 2012

Положение

Моя функция обратного вызова php отправляет - если в БД не было найдено результатов - возвращает следующее:

header( "Content-Type: application/json" );
echo json_encode( array(
     'success'  => false
    ,'error'    => 'No results'
) );
exit;

Задача

При отправке обратно строки, закодированной в JSON, я могу перехватывать без проба во время функции .success() и просто возвращаться и открывать диалоговое окно.

Что не работает, так это перехват функции .complete(), которая срабатывает после срабатывания success/error. Внутри функции complete у меня есть status = success, и я вижу только мои error внутри jqxhr.responseText, отформатированные в виде строки: "{"success":false,"error":"No results"}".

Я не могу использовать error, так как это не 404/whatever. Это просто Нет результатов .

Вопрос: Как я могу перехватить и отменить / отменить `complete`?

Когда я сейчас пойду и добавлю substring проверку на всевозможные сообщения об ошибках, я разозлюсь.

Примечания: я использую jQuery в сочетании с jQuery Mobile.


Данные получают процесс $.ajax(), как показано ниже (упрощенный пример):

$.ajax( {
     type:      'POST'
    ,url:       my_object.ajaxurl
    ,data:      my_data
    ,success:   function( response, status, request )
     {
        if ( false == response.success )
        {
            $( '#note h3' ).html( response.error );

            return $.mobile.changePage( '#note', 'pop', true, true );
        }

        // Markers
        doStuffWith( response.data );

        $.mobile.changePage( $( '#another_view' ) );
     }
    ,error:     function( jqxhr , settings , exception )
     {

     }
    ,complete: function( jqxhr, status )
     {
        console.log( jqxhr );
        console.log( status );
        // @TODO ABORT IF ERROR
        $( '#list_canvas' ).listview( 'refresh' );
     }
} );

Ответы [ 2 ]

0 голосов
/ 28 февраля 2012

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

Так что вы можете сделать это

complete: function( jqxhr, status )
 {
    console.log( jqxhr );
    console.log( status );

    if(status == "success"){
        $( '#list_canvas' ).listview( 'refresh' );
    }
 }

Или просто сброситьполностью завершить обратный вызов и выполнить обновление в функции успеха

success:   function( response, status, request )
 {
    if ( false == response.success )
    {
        $( '#note h3' ).html( response.error );

        return $.mobile.changePage( '#note', 'pop', true, true );
    }

    // Markers
    doStuffWith( response.data );

    $.mobile.changePage( $( '#another_view' ) );
    $( '#list_canvas' ).listview( 'refresh' );
 }

Если вы получаете сообщение об ошибке, потому что пытаетесь обновить просмотр списка, который еще не инициализирован, то вам следует сосредоточиться на инициализацииlistview до вы делаете любые AJAX-вызовы.

0 голосов
/ 28 февраля 2012

Просто вызовите обновление списка в конце успешного обратного вызова и удалите полный обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...