同时执行同步和异步AJAX

时间:2012-03-31 01:31:32

标签: jquery ajax asynchronous synchronous

我想运行AJAX来获取一些URL数据,从数据构建一个对象并将其分配给一个全局对象变量。所以我知道我需要运行同步 ajax请求。 (对吧?)我还想利用 beforeSend 设置为我的用户提供加载屏幕。 (我可能应该先问一下,才发现实现它的唯一方法吗?)我如何结合使用同步和异步的好处?

异步:

$.ajax({
        url:'scripts/scripts.php?call=page&url='+thisurl, /*local*/
        dataType:'html',
        beforeSend:function(){
            $('#display').html('<div class="loading"></div>');
        },
        success:function(data, textStatus, jqXHR){
            /*local*/ myobj = getMyObj(data); $('#display').html(myobj);
        },
        error:function(jqXHR, textStatus, errorThrown){ }
});

同步:

$.ajax({
        url:'scripts/scripts.php?call=page&url='+thisurl, /*local*/
        dataType:'html',
        async:false,
        success:function(data, textStatus, jqXHR){
            /*global*/ myobj = getMyObj(data);
        }
});
$('#display').html(myobj);

抱歉,如果这没有意义

2 个答案:

答案 0 :(得分:2)

嗯,嗯,很明显,如果你想在同步ajax函数之前显示一些东西,你会这样做:

$('#display').html('<div class="loading"></div>');
$.ajax({
        url:'scripts/scripts.php?call=page&url='+thisurl, /*local*/
        dataType:'html',
        async:false,
        success:function(data, textStatus, jqXHR){
            /*global*/ myobj = getMyObj(data);
        }
});
$('#display').html(myobj);

另一方面为什么要使用同步Ajax函数,这是一个非常糟糕的主意,改为使用promises,或者类似的东西:

var Ajax = $.ajax({
              url:'scripts/scripts.php?call=page&url='+thisurl,
              dataType:'html'
           });

//do something later
$("#mybutton").on('click', function() {
    Ajax.done(function(data) {         //if/when the ajax function is completed
        $('#display').html(data);
    });
});        

或者将ajax放在一个单独的函数中并以相同的方式运行,除了同步Ajax调用之外还有很多选项!

答案 1 :(得分:0)

你有可能不想做同步的AJAX请求。来自jQuery.ajax文档:

  

请注意,同步请求可能会暂时锁定浏览器,并在请求处于活动状态时禁用任何操作

更好的做法是创建异步请求并设置微调器以让用户知道您正在为它们检索数据。