0

我的 javascript 代码加载器隐藏有问题,但它应该隐藏在 jax 响应的最后一个。

function reverseGeocoding(lat,lng, callback){
    var url = 'http://open.mapquestapi.com/nominatim/v1/reverse?format=json&lat=' + lat + '&lon=' +lng+' &zoom=18&addressdetails=1';
    $.ajax({
        url: url,                       
        crossDomain:true,
        success: function(response){
               fn1(response,mapobject);   //takes 30 seconds
               fn2(response,mapobject);   //takes 10 seconds
               fn3(response,mapobject);   //takes 30 seconds
               fn4(response,mapobject);   //takes 20 seconds
               fn5(response,mapobject);   //takes 30 seconds
               fn6(response,mapobject);   //takes 30 seconds
               fn7(response,mapobject);   //takes 40 seconds
               $("#loader").show();

        }
    });

}

但问题是响应来后加载程序显示。我想在所有函数调用 fn1、fn2、fn3、fn4、fn5、fn6、fn7 之后显示加载器。请帮忙

4

2 回答 2

2

您可以使用$.Deffered, 特别是$.when$.then. 假设您在所有函数中执行$.ajax请求,它们应该如下所示:

function f1() {
    return $.ajax({
        url: "someUrl",
        success: function (data) {
            console.log("f1 done")
        }
    });
}

这样的函数将返回一个promise,然后可以使用以下方法将其放置在您的回调中$.when

 $.when(f1(), f2(), f3()).then(function () {
     console.log("all done!");
 });

小提琴样本

于 2013-10-08T06:08:38.997 回答
2

您可以使用 jquery 延迟对象。

http://api.jquery.com/deferred.done/

var dfd = $.Deferred();

    dfd
        .done( [ fn1, fn2 ], fn3, [ fn2, fn1 ] )
        .done(function( n ) {
            $( "p" ).append( n + " we're done." );
        });
于 2013-10-08T06:09:00.117 回答