在json错误响应上重新运行AJAX成功函数

时间:2018-09-28 08:50:52

标签: jquery ajax

我有一个ajax调用,该调用旨在查询报告队列,然后使用该ID再次查询报告并返回JSON。这段代码有效:

$(document).ready(function(){
    $("#r2").click(function(){
        $('#loading').show();
        $.ajax({
        url: "report.php", 
        dataType: 'json',
        data: { 
            type: 'queue', 
            ref: 2
        },
        success: function(result){
            console.log(result.reportID); 
            setTimeout(function(){
            console.log("Go"); 
            $.ajax({
              url: "report.php", 
              dataType: 'json',
              data: { 
              type: 'get', 
              ref: result.reportID
            },
            success: function(result){ 
                console.log(result); 
                $('#loading').hide();
                $('#output2').html(result.report.totals);
            }
            });
            },1000);
        }});
    });
});

尽管有时候报告还没有准备好,在这种情况下,我们会以JSON而不是result.report.totals

的形式获得此响应
{error: "report_not_ready", error_description: "Report not ready", error_uri: null}

所以,我要的是让它再次以相同的结果尝试这段代码。reportID:

success: function(result){
    console.log(result.reportID); 
    setTimeout(function(){
    console.log("Go"); 
    $.ajax({
      url: "report.php", 
      dataType: 'json',
      data: { 
      type: 'get', 
      ref: result.reportID
    },
    success: function(result){ 
        console.log(result); 
        $('#loading').hide();
        $('#output2').html(result.report.totals);
    }
    });
    },1000);
}});

我对此的尝试如下:

success: function(result){ 
    if (result.report.error == "report_not_ready") {
    // RERUN THE SUCCESS FUNCTION
    }
    // OTHERWISE OUTPUT THE TOTAL
    $('#output2').html(result.report.totals);
}

我如何要求它通过成功函数循环返回以重试查询报告?

2 个答案:

答案 0 :(得分:2)

首先,这里您无需重复代码,而只是将其替换为参数。此外,它允许在需要时递归调用。

$("#r2").click(function(){

getReport(2, 'queue')

});

function getReport(refId, type)
{
   $.ajax({
        url: "report.php", 
        dataType: 'json',
        data: { 
            type: type, 
            ref: refId
        },
        success: function(result){
          
           if (refId == 2)
           {
               getReport(result.reportID, 'get');
           }
           else if(result.report.error == "report_not_ready") 
           {
               getReport(refId, 'get');
           }
           else
           {
              $('#output2').html(result.report.totals);
           }
         }
    });
}

答案 1 :(得分:0)

如果成功结果是JSON,请在使用前在数组中对其进行解码。

像下面一样

success: function(result){ 
    resultArray = $.parseJson(result); // Like this
    if (resultArray.report.error == "report_not_ready") {
    // RERUN THE SUCCESS FUNCTION
    }
    // OTHERWISE OUTPUT THE TOTAL
    $('#output2').html(resultArray.report.totals);
}