是的,你应该使用延迟对象。
这里最简单的方法是创建一个数组,您可以在其中存储调用内部$.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