【问题标题】:ajax call from loop in asp.net来自asp.net中循环的ajax调用
【发布时间】:2016-09-16 08:02:17
【问题描述】:

GetDataStudentPDF() 调用 webmethods 并获取项目列表,每个项目都是一个 html 脚本。我只想将该脚本设置为 div,然后调用另一个 SaveImage() 函数,该函数将 div 转换为图像并保存它。每个项目都应该发生这种情况

function SaveImage(i, lastI) {
           $('#divStdTemplate').html2canvas({

               onrendered: function (canvas) {

                   var img = canvas.toDataURL("image/png").replace(/^data[:]image\/(png|jpg|jpeg)[;]base64,/i, "");

                   $.ajax({
                       type: "POST",
                       url: "SliderPage.aspx/StudentPopUpUploadImage",
                       data: JSON.stringify({ imageData: img }),
                       contentType: "application/json; charset=utf-8",
                       dataType: 'json',
                       async: false,
                       success: function (response) {

                       },
                       failure: function (response) {
                           alert("html2canvas Fail");
                       },
                       error: function (response) {
                           alert("html2canvas Error * " + response.error + " * " + response.responseText);
                       }
                   });

               }
           });

       }
    function GetDataStudentPDF()
       {
           var cnt1 = 0;
           $.ajax({
               type: "POST",
               url: 'SliderPage.aspx/GetDataStudentPDF',
               data: JSON.stringify({}),
               contentType: "application/json; charset=utf-8",
               dataType: 'json',
               async: true,
               success: function (response) {

                   var data = response.d;

                   $.each(data, function (index, item) {
                       $("#divStdTemplate").html(item);
                       SaveImage();

                   });

               },
               failure: function (response) {
               alert("Fail");
           },
           error: function (response) {
               alert(response);
           }

           });

       }

【问题讨论】:

    标签: jquery c#-4.0 asp.net-ajax


    【解决方案1】:

    您可以递归调用一个执行 ajax 调用的函数。这将确保在成功案例之前不会调用下一次迭代。

    *请注意,在这种情况下,如果任何调用失败或出错,将停止执行。

    更新 1

    因为这高度依赖于您的实现,所以无法在您的系统之外对其进行测试,但问题是您没有递归调用 SaveImage(您仍然一次调用每个迭代)。

    以下是如何递归调用它的想法:

    var dataStudentArray = [];
    
    function SaveImage(i) {
      $('#divStdTemplate').html2canvas({
        onrendered: function (canvas) {
          var img = canvas.toDataURL("image/png").replace(/^data[:]image\/(png|jpg|jpeg)[;]base64,/i, "");
    
          $.ajax({
            type: "POST",
            url: "SliderPage.aspx/StudentPopUpUploadImage",
            data: JSON.stringify({ imageData: img }),
            contentType: "application/json; charset=utf-8",
            dataType: 'json',
            async: false,
            success: function (response) {
              //successfully Saved Image
              $("#divStdTemplate").html(response.d);
    
              //call next iteration if not last
              if(i < (dataStudentArray.length - 1)) {
                SaveId(i+1);
              }
            },
            failure: function (response) {
              alert("html2canvas Fail");
            },
            error: function (response) {
              alert("html2canvas Error * " + response.error + " * " + response.responseText);
            }
          });
        }
      });
    }
    
    function GetDataStudentPDF()
    {
      var cnt1 = 0;
      $.ajax({
        type: "POST",
        url: 'SliderPage.aspx/GetDataStudentPDF',
        data: JSON.stringify({}),
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        async: true,
        success: function (response) {
            //set output as array (depending on your data, you may need to iterate through the data and add each item to the dataStudentArray)
          dataStudentArray = response.d;
    
          //save the first item
          SaveImage(0);
        },
        failure: function (response) {
          alert("Fail");
        },
        error: function (response) {
          alert(response);
        }
    
      });
    
    }
    
    //get all data
    GetDataStudentPDF();
    

    这里有一个简单的 JSFiddle 来展示这个:https://jsfiddle.net/2yxg2r0o/2/

    更新 0

    SaveId = function(i, lastI) {
        $.ajax({
        type: "POST",
        url: 'SliderPage.aspx/SetDataStudentPDF',
        data: JSON.stringify({ jd: i }),
        contentType: "application/json; charset=utf-8",
        dataType: 'json',
        async: false,
        success: function (response) {
          $("#divStdTemplate").html(response.d);
          SaveImage();
          if(i<lastI-1) {
            SaveId(i+1, lastI);
          }
        },
        failure: function (response) {
          alert("myfunction Fail");
        },
        error: function (response) {
          alert("myfunction error ** " + response.status + " -- " + response.statusCode + " -- " + response.statusText);
        }
      });
    }
    
    SaveId(0, 2);
    

    这里有一个 JSFiddle 来简单地展示代码流:https://jsfiddle.net/2yxg2r0o/

    【讨论】:

    • 感谢 Jem 的努力,但仍然有相同的异步调用,这意味着如果我想更新 html ' $("#divStdTemplate").html(response.d)' 并调用 SaveImage() 21次,那么问题是它在最后一次调用 SaveImage() 21 次,并且所有 21 次 'divStdTemplate' 具有相同的 html。
    • 直到ajax调用返回成功才会调用success函数,所以下次迭代SaveId直到上一次成功才会调用。我在这里添加了一个延迟,它应该模拟结果 jsfiddle.net/2yxg2r0o/1 。你能告诉我你是如何实现它以提供更多信息吗?
    • 嗨 Jem,谢谢,我已经添加了完整的代码希望能帮助你理解
    • 参见上面的更新 1。您遇到的问题是您仍然没有递归调用 SaveImage 。您需要在 SaveImage ajax 调用的 Success 函数中从自身内部调用该函数进行下一次迭代。
    • Jem,感谢您一直以来的努力,它现在正在运行。在按照您的建议将响应添加到数组之前,从 GetDataStudentPDF 的成功调用 SaveImage() 一次,并且 SaveImage() 有循环调用自身。再次感谢
    猜你喜欢
    • 2013-08-07
    • 1970-01-01
    • 2012-08-05
    • 1970-01-01
    • 2012-03-03
    • 1970-01-01
    • 2020-04-21
    • 2017-02-25
    • 2015-04-28
    相关资源
    最近更新 更多