是的,你應該使用延遲對象。
這裏最簡單的方法是創建一個數組,您可以在其中存儲調用內部$.getJSON()
的jqXHR
結果。
var def = [];
for (var i = 0; ...) {
def[i] = $.getJSON(...).done(function(videoDetails) {
... // extract and store in youtubeMap
});
}
,然後在整個函數結束,使用$.when
創建一個新的承諾,將只解決了當所有內部通話已經完成:
return $.when.apply($, def).then(function() {
return youtubeMap;
});
和然後使用.done
從你的函數處理結果:
getYoutubeDurationMap(query).done(function(map) {
// map contains your results
});
請參閱http://jsfiddle.net/alnitak/8XQ4H/瞭解如何使用此YouTube API演示延遲對象如何讓您將AJAX調用與「持續搜索」的後續數據處理完全分開。
這段代碼有點長,但也在這裏轉載。但是,儘管代碼比您預期的要長,但請注意,此處的通用功能現在可以重複使用,您可能希望對YouTube API調用任意調用。
// generic search - some of the fields could be parameterised
function youtubeSearch(query) {
var url = 'https://gdata.youtube.com/feeds/api/videos';
return $.getJSON(url, {
q: query,
'max-results': 20,
duration: 'long', category: 'film', // parameters?
alt: 'json', v: 2
});
}
// get details for one YouTube vid
function youtubeDetails(id) {
var url = 'https://gdata.youtube.com/feeds/api/videos/' + id;
return $.getJSON(url, {
alt: 'json', v: 2
});
}
// get the details for *all* the vids returned by a search
function youtubeResultDetails(result) {
var details = [];
var def = result.feed.entry.map(function(entry, i) {
var id = entry.id.$t.substring(27);
return youtubeDetails(id).done(function(data) {
details[i] = data;
});
});
return $.when.apply($, def).then(function() {
return details;
});
}
// use deferred composition to do a search and then get all details
function youtubeSearchDetails(query) {
return youtubeSearch(query).then(youtubeResultDetails);
}
// this code (and _only_ this code) specific to your requirement to
// return an array of {id, duration}
function youtubeDetailsToDurationMap(details) {
return details.map(function(detail) {
return {
id: detail.entry.id.$t.substring(27),
duration: detail.entry.media$group.media$content[0].duration
}
});
}
// and calling it all together
youtubeSearchDetails("after earth").then(youtubeDetailsToDurationMap).done(function(map) {
// use map[i].id and .duration
});
不,您應該提出同步請求。 但是不要這樣做:學習使用Javascript的異步邏輯,並且你也可以很好地處理其他許多事情。 – MaxArt
執行回調函數... – writeToBhuwan
是的,你應該使用延遲對象。 – Alnitak