【问题标题】:Second Jquery json getting fired before first Jquery being complete在第一个 Jquery 完成之前,第二个 Jquery json 被触发
【发布时间】:2015-01-29 05:25:45
【问题描述】:

我有两个 javascript 函数,它们使用 jquery json 填充一些数据。两者都工作正常,但问题是第二个函数在第一个函数执行之前被调用。我的代码是:

$(document).ready(function () {        
    loadSubject();
    getTopic();       
});

function loadSubject() {
    var CourseId = document.getElementById('CourseId').value;
    alert('22222');
    jQuery.support.cors = true;
    $.ajax({
        url: 'http://220.45.89.129/api/LibraryApi',
        type: 'Get',
        contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
        data: { DataType: 'Subject', UserRecId: 0, ParentId: CourseId },
        dataType: 'json',
        success: function (data) {
            var subjectDivs = "";
            var divs = "";
            var i = 1;
            $.each(data, function (index, value) {
                divs = "";
                // Some code here
                i = i + 1;
            });
            subjectDivs = subjectDivs + divs;
            alert('11111');
            $('#cCount').val(i);
            document.getElementById('accordion').innerHTML = subjectDivs;
        },
        error: function (e) {
            alert(JSON.stringify(e));
        }
    });
}

function getTopic() {
    var c = $('#cCount').val();
    alert(c);
    for (var i = 1; i <= c; i++) {
        var subId = $('#hdn_' + i).val();
        jQuery.support.cors = true;
        $.ajax({
            url: 'http://220.45.89.129/api/LibraryApi',
            type: 'Get',
            contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
            data: { DataType: 'Topic', UserRecId: 0, ParentId: subId },
            dataType: 'json',
            success: function (data) {
                var topicDivs = "";
                var divs = "";
                tDivs = '';
                $.each(data, function (index, value) {
                    divs = '';
                    divs = '<div class="row">';
                    divs = divs + '<div class="subject">' + value.Name + '</div>';
                    divs = divs + "</div>";
                    topicDivs = topicDivs + divs;
                });
                $('#sDiv_' + i).html(topicDivs);
            },
            error: function (e) {
                alert(JSON.stringify(e));
            }
        });
    }
}

【问题讨论】:

  • 尝试在loadSubjectgetTopic 处添加return $.ajax();然后loadSubject().then(getTopic)
  • @guest271314 可以显示更多代码行或一个小示例。

标签: javascript jquery asp.net asp.net-mvc json


【解决方案1】:

这不是 ajax get 的执行方式。如果您将两个 jquery ajax 请求一个接一个地放置,那么它们将按顺序执行,不需要在第一个请求完成或收到第一个请求的响应后执行第二个请求。

如果你想让这种情况发生,那么有两种方法

1.使用 async:'false'

这会请求等待,直到收到响应,然后再在 javascript 中执行下一条语句。

What does "async: false" do in jQuery.ajax()?

2。使用回调

编写您想要成功执行的第二个函数或完成第一个 ajax 请求的回调。

jQuery ajax success callback function definition

【讨论】:

    【解决方案2】:

    尝试在loadSubjectgetTopic中的$.ajax({})之前添加return语句,返回jQuerypromise对象,可以在deferred.then处理

        function loadSubject() {
          return $.ajax()
        }
    
        function getTopic() {
          return $.ajax()
        }
    
        loadSubject().then(getTopic);
    

    function a() {
      return new $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(1) 
        }, 2000)
      }).promise().then(function(data) {
        console.log(data)
      })
    }
    
    function b() {
      return new $.Deferred(function(dfd) {
        setTimeout(function() {
          dfd.resolve(2) 
        }, 2000)
      }).promise().then(function(data) {
        console.log(data)
      })
    }
    
    a().then(b)
    

    【讨论】:

      【解决方案3】:

      你必须在你的第一个 ajax 请求中添加 async:false,它会停止下一次执行,直到第一个 ajax 请求完成它的执行。 所以你的第一个函数是这样的

      function loadSubject() {
      var CourseId = document.getElementById('CourseId').value;
      jQuery.support.cors = true;
      $.ajax({
          url: 'http://220.45.89.129/api/LibraryApi',
          type: 'Get',
          contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
          data: { DataType: 'Subject', UserRecId: 0, ParentId: CourseId },
          dataType: 'json',
          async:false,
          success: function (data) {
              var subjectDivs = "";
              var divs = "";
              var i = 1;
              $.each(data, function (index, value) {
                  divs = "";
                  // Some code here
                  i = i + 1;
              });
              subjectDivs = subjectDivs + divs;
              alert('11111');
              $('#cCount').val(i);
              document.getElementById('accordion').innerHTML = subjectDivs;
          },
          error: function (e) {
              alert(JSON.stringify(e));
          }
      });
      

      }

      【讨论】:

      • 这个好多了。
      【解决方案4】:

      从第一个ajax success function调用第二个函数

      $(document).ready(function () {        
          loadSubject();
      });
      
          function loadSubject() {
              // code here
              $.ajax({
                  url: 'http://220.45.89.129/api/LibraryApi',
                  type: 'Get',
                  contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
                  data: { DataType: 'Subject', UserRecId: 0, ParentId: CourseId },
                  dataType: 'json',
                  success: function (data) {
                     //code here
                         getTopic();    // Second function calling
                  },
                  error: function (e) {
                      alert(JSON.stringify(e));
                  }
              });
          }
      

      现在,当第一个函数成功执行时,将调用第二个函数。

      【讨论】:

      • 我已经尝试过同样类型的问题,在完成第二个函数之前执行下一行代码。
      猜你喜欢
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多