首页 > 解决方案 > setTimeout 的替代方案?

问题描述

在下面的代码中,我从response参数中获取数据,然后渲染图表。然后我通过从imgData参数中获取图像的 base64 字符串来导出,然后使用 AJAX 调用在会话中设置 base64 字符串。

之后,我将进行另一个 AJAX 调用以创建报告。在这个 AJAX 调用中,我使用存储在会话中的图像作为 base64 字符串。在打印报告时,我得到了部分图像。这是由于函数中的大部分数据setTimeout在某些情况下无法按预期工作。

当我删除setTimeout函数时,报告中没有生成图像,因为它在完成任务之前进行了另一个 AJAX 调用。

谁能给我一个解决方案?提前致谢。

function LoadChart(response, callback) {
  if (response.length > 1) {
    //var aData = JSON.parse(response);
    document.getElementById('loading').style.display = "block";

    var aData = $.parseJSON(response);
    var chartData = [];
    $.each(aData, function(inx, val) {
      var obj = {};
      obj.AVARating = val.AVARating;
      obj.Per = val.Per;
      //obj.color = "#696969";
      chartData.push(obj);
    });

    var assessmentId = $('#hdnAssessmentId').val();
    var siteName = $('#hdnSiteName').val();
    var companyName = $('#hdnCompanyDesc').val();
    var countryName = $('#hdnCountryDesc').val();
    var latitude = $('#hdnLatitude').val();
    var longitude = $('#hdnLongitude').val();
    var division = $('#hdnDivisionDesc').val();
    var reportedDate = $('#hdnReportedDate').val();
    var username = $('#hdnWindowsID').val();
    var countryCode = $('#hdnCountryCode').val();
    var CompanyCode = $('#hdnCompanyCode').val();
    var SiteCode = $('#hdnSiteCode').val();
    var DivisionCode = $('#hdnDivisionCode').val();
    //am4core.disposeAllCharts();
    var chart = am4core.create("donutchart", am4charts.RadarChart);
    //chart.dataSource.url =   'VATReportGeneration.aspx?key=1&windowsId=' + username + '&divisionCode=' + DivisionCode + '&countryCode=' + countryCode + '&companyCode=' + CompanyCode + '&siteCode=' + SiteCode + '&assessmentId=' + assessmentId;
    chart.data = chartData;
    //chart.data = response;

    /* Add data */
    //chart.data = [{
    //    "AVARating": "Perimeter",
    //    "Per": 10
    //}, {
    //    "AVARating": "CCTV",
    //    "Per": 12
    //}, {
    //    "AVARating": "Intrusion Detection",
    //    "Per": 30
    //}, {
    //    "AVARating": "Information Protection",
    //    "Per": 40
    //}, {
    //    "AVARating": "Guarded forces",
    //    "Per": 50
    //}, {
    //    "AVARating": "Safe Haven",
    //    "Per": 60
    //}, {
    //    "AVARating": "Control Room",
    //    "Per": 70
    //}, {
    //    "AVARating": "Security Plan",
    //    "Per": 80
    //}, {
    //    "AVARating": "Procedures",
    //    "Per": 90
    //}];

    /* Create axes */
    var categoryAxis = chart.xAxes.push(new am4charts.CategoryAxis());
    categoryAxis.dataFields.category = "AVARating";

    var valueAxis = chart.yAxes.push(new am4charts.ValueAxis());
    valueAxis.renderer.axisFills.template.fill = chart.colors.getIndex(2);
    valueAxis.renderer.axisFills.template.fillOpacity = 0.05;
    valueAxis.renderer.gridType = "polygons";
    valueAxis.min = 0;
    valueAxis.max = 100;
    valueAxis.renderer.minGridDistance = 10;

    /* Create and configure series */
    var series = chart.series.push(new am4charts.RadarSeries());
    series.dataFields.valueY = "Per";
    series.dataFields.categoryX = "AVARating";
    series.strokeWidth = 3;
    series.fillOpacity = 0.3;

    var circleBullet = series.bullets.push(new am4charts.CircleBullet());
    circleBullet.circle.stroke = am4core.color("#fff");
    circleBullet.circle.strokeWidth = 2;

    setTimeout(function() {
      chart.exporting.getImage("png").then(function(imgData) {
        //console.log(imgData); // contains exported image data
        console.log(imgData);

        var image = imgData.replace('data:image/png;base64,', '');

        $.ajax({
          type: "POST",
          contentType: "application/json; charset=utf-8",
          url: "VATReportGeneration.aspx/SetImageInSession",
          data: JSON.stringify({
            "image": image
          }),
          dataType: "json",
          success: function(data) {
            if (data != '') {
              // document.getElementById('loading').style.display = "none";
              var url = "../../ReportHandler/VATConfigurationFileHandler.aspx";
              var file = url + '?VAT_Report=VAT_Report&assessmentId=' + assessmentId + '&siteName=' + siteName + '&companyName=' + companyName + '&countryName=' + countryName + '&latitude=' + latitude + '&longitude=' + longitude + '&division=' + division + '&reportedDate=' + reportedDate; //+'&image='+txt;
              $get("exporthandler").src = file;
              chart.dispose();
              document.getElementById('loading').style.display = "none";
            }
          },
          error: function(data) { }
        });
      });
    }, 5000);
  }
}

标签: javascriptc#jqueryajax

解决方案


您可以使用 setInterval

 setInterval(function() {
   // Code Here
 }, 3000);

3000ms 是间隔的超时时间


推荐阅读