如何根据响应取消jQuery.ajax完成?

时间:2012-02-28 14:06:26

标签: jquery jquery-mobile

场合

我的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 :(得分:0)

只需在成功回调结束时调用listview刷新,然后删除完整的回调。

答案 1 :(得分:0)

如果您read up了解完整的函数参数返回的内容,您会看到这些消息中有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' );
 }

如果您因为尝试刷新尚未初始化的列表视图而收到错误,那么您应该专注于在进行任何AJAX调用之前初始化listview