2012-10-22 90 views
2

我有4個不同的JQuery AJAX函數,每個函數都從last.fm API獲取不同的信息。此信息必須在工具提示中連接在一起。如何等待AJAX​​請求在JQuery中完成?

這是我的4個功能:

  1. 獲取給定的軌道&藝術家的專輯。返回曲目名稱。
  2. 獲取藝術家形象。返回1個URL。
  3. 獲取該藝術家的前三張專輯。返回3個字符串的數組。
  4. 獲取給定藝術家的排名第一的最佳曲目。返回曲目名稱。

 

var getTrackAlbum = function(track, artist) { 
    $.getJSON(
     settings.PHP_REQUEST_URL, 
     { 
     method: "track.getInfo", 
     api_key : settings.LASTFM_APIKEY, 
     track : track, 
     artist : artist, 
     format : "json" 
     }, 
     function(data) { 
     return data.track.album.title; 
     }); 
} 

var getArtistImage = function(artist) { 
    var options = { 
     artSize: 'medium', 
     noart: 'images/noartwork.gif', 
    } 

    if(options.artSize == 'small'){imgSize = 0} 
    if(options.artSize == 'medium'){imgSize = 1} 
    if(options.artSize == 'large'){imgSize = 2} 

    $.getJSON(
     settings.PHP_REQUEST_URL, 
     { 
     method: "artist.getInfo", 
     api_key : settings.LASTFM_APIKEY, 
     artist : artist, 
     format : "json" 
     }, 
     function(data) { 
     return stripslashes(data.artist.image[imgSize]['#text']); 
     }); 
} 

var getArtistTopAlbums = function(artist) { 
    var albums = new Array(); 

    var onComplete = function() { 
     return albums; 
    } 

    $.getJSON(
     settings.PHP_REQUEST_URL, 
     { 
     method: "artist.getTopAlbums", 
     api_key : settings.LASTFM_APIKEY, 
     artist : artist, 
     format : "json" 
     }, 
     function(data) { 
     $.each(data.topalbums.album, function(i, item){ 
      albums[i] = item.name; 

      if(i == 2) { 
      onComplete.call(this); 
      return; 
      } 
     }); 
     }); 
} 

var getArtistTopTrack = function(artist) { 
    $.getJSON(
     settings.PHP_REQUEST_URL, 
     { 
     method: "artist.getTopTracks", 
     api_key : settings.LASTFM_APIKEY, 
     artist : artist, 
     format : "json" 
     }, 
     function(data) { 
     return data.toptracks.track[0].name; 
     }); 
} 

我已決定反對這樣做重用目的的唯一方法內的所有請求。但是,現在我想在設置我的工具提示的HTML之前等待所有的AJAX請求完成。

這裏是我的工具提示代碼:

$('.lfm_info').on('mouseover', function(){ 
      var toolTip = $(this).children('.tooltip'); 

      var trackhtml = $(this).parent().children('.lfm_song').html().split("."); 
      var track = trackhtml[1].trim(); 
      var artist = $(this).parent().children('.lfm_artist').html(); 

     // needs to wait until the AJAX is done!  
     toolTip.html('html here'); 

     $('#tracks').mouseleave(function(){ 
     if(toolTip.is(':visible')){ 
      toolTip.fadeOut(500); 
     };  
     }); 

     toolTip.fadeIn(500);  
     }); 
} 

我怎麼會等待所有請求調用toolTip.html(...)前完成?

+0

你想看看jQuery的Deferred對象http://api.jquery.com/category/deferred-object/ –

+0

我可以用'$ .wait(...)'?如果是這樣,我將如何從每個回報中獲取數據? – swiftcode

+0

你應該習慣於格式化你的代碼,以便在你發佈後能夠很好地閱讀。請發佈http://SSCCE.org,而不是發佈所有代碼 –

回答

13

存儲每個請求,然後使用$.when來創建單個延遲對象來偵聽它們全部完成。

var req1 = $.ajax({...}); 
var req2 = $.ajax({...}); 
var req3 = $.ajax({...}); 

$.when(req1, req2, req3).done(function(){ 
    console.log("all done") 
}); 
+0

我的函數被定義爲'var getTrackAlbum = function(args){...}'。我可以這樣做嗎? '$ .when(getTrackAlbum(artist,track)等)......' – swiftcode

+0

只要你的函數返回$ .ajax返回的值。例如,'var getTrackAlbum = function(){return $ .getJSON(...)}' –

+0

它們每個都返回不同的值,就像我所解釋的。我處理每個函數中的數據並返回不同的值。我是否需要發送原始數據(因此不需要'$ .getJSON(...)'中的回調)? – swiftcode