Ajax 从多个 url 中设置变量

Ajax set variable from multiple url

我真的是 ajax 的新手,想知道是否有办法避免在下面使用 setTimeout。我需要从两个 url(/blog 和 /blog/all)创建两个变量。然后我需要在一个单独的函数中一起使用这些变量。我的(有缺陷的)计划是进行两次 ajax 调用并将结果传递给一个空的 div,然后根据那些 div 的内容设置新变量以运行我的功能。它有效,但我必须使用 setTimeout,这显然不理想。有没有办法将一个 ajax 调用嵌套在另一个调用中?我试过了,但没有运气。这是我拥有的:

$(document).ready(function(){
    $.ajax({
        url : "/blog/all",
        success : function (data) {
            var totalPosts = $(data).find('.post-item').length
            console.log("totalPosts: " + totalPosts);
            $('.totalPosts').text(totalPosts);
        }
    });

    $.ajax({
        url : "/blog",
        success : function (data) {
            var pagePosts = $(data).find('.post-item').length
            console.log("pagePosts: " + pagePosts);
            $('.pagePosts').text(pagePosts);
        }
    });

    setTimeout(function(){  

        var tPosts = $('.totalPosts').text();
        var pPosts = $('.pagePosts').text();
        console.log("tPosts: " + tPosts);
        console.log("pPosts: " + pPosts);
    }, 3000);
});

我会这样做:

$(document).ready(function(){
    $.ajax({
        url : "/blog/all",
        success : function (data1) {
            var totalPosts = $(data1).find('.post-item').length
            console.log("totalPosts: " + totalPosts);
            $('.totalPosts').text(totalPosts);
            $.ajax({
               url : "/blog",
               success : function (data2) {
                  var pagePosts = $(data2).find('.post-item').length
                  console.log("pagePosts: " + pagePosts);
                  $('.pagePosts').text(pagePosts);

                  // Here goes the code that was in timeout
                  var tPosts = $('.totalPosts').text();
                  var pPosts = $('.pagePosts').text();
                  console.log("tPosts: " + tPosts);
                  console.log("pPosts: " + pPosts);
               }
            });
         }
    });
});

当所有 AJAX 调用完成后,您可以使用 $.when 采取行动。

$(document).ready(function(){
    var promise1 = $.ajax({
        url : "/blog/all",
        success : function (data) {
            var totalPosts = $(data).find('.post-item').length
            console.log("totalPosts: " + totalPosts);
            $('.totalPosts').text(totalPosts);
        }
    });

    var promise2 = $.ajax({
        url : "/blog",
        success : function (data) {
            var pagePosts = $(data).find('.post-item').length
            console.log("pagePosts: " + pagePosts);
            $('.pagePosts').text(pagePosts);
        }
    });

    $.when(promise1, promise2).then(function(){  
        var tPosts = $('.totalPosts').text();
        var pPosts = $('.pagePosts').text();
        console.log("tPosts: " + tPosts);
        console.log("pPosts: " + pPosts);
    });
});

通过使用成功和错误回调,您可以在不依赖超时的情况下保证数据的可用性。

如果一个调用依赖于另一个,为什么不使用内置回调?下面是一些伪代码来说明

var allBlogItems = null;
var getAll = function(){
  $.ajax {
    url : "/blog/all",
    success: function(data){
       allBlogItems = data;
       getBlogThenSetHTML();
     }
    }
  }
 };
 var blogData = null; 
 var getBlogThenSetHTML = function(){
   $.ajax {
    url : "/blog/all",
    success: function(data){
       blogData = data;
       doSomething();
     }
    }
  }
 };

 var doSomething = function(){
   console.log(blogData);
   console.log(allBlogData);
 };

这当然只是一个简单粗暴的例子。您可以按顺序执行调用,并在两次调用都完成后按您喜欢的方式使用结果数据。

将数据对象封装在函数中也有助于提高可重用性和可读性。在 ajax 个调用中嵌套 ajax 个调用是可怕的。