这可能是我对 AJAX 功能的误解,但我遇到了在 GET 请求实际完成之前$.get
调用回调 ( ) 的情况。.always()
至少,它看起来是这样的。
编码
var apiRequest = 'some/url/';
// fetch list of video embed codes
$.get( apiRequest, function( embed_codes ) {
// added this per Explosion Pills' answer
var jqxhrs = [];
// for each embed code, get video details (name, duration, etc.)
for ( var i = 0; i < embed_codes.length; i++ ) {
var videoDetailsRequest = '/v2/assets/' + embed_codes[i];
//..declare vars..
// fetch video details
var jqxhr = $.get( videoDetailsRequest, function( video ) {
// build playlist entry for each video
playlistItem = '<li><h3>' + video.name + '</h3><p>' + video.description + '</p></li>';
// create object of video HTML, with key = "video name" for sorting later
videoArray[video.name] = playlistItem;
}, 'jsonp' )
// added this per Explosion Pills' answer
jqxhrs.push( jqxhr );
}
// updated from jqxhr.always( function() {
$.when( jqxhrs ).always( function() {
// create array of keys
for ( k in videoArray ) {
if ( videoArray.hasOwnProperty( k ) ) { keys.push( k ); }
}
// append alphabetized list of videos to the page...
});
}, 'jsonp' );
代码的作用
本质上,代码是这样做的:遍历视频嵌入代码列表。对于循环的每次迭代for
,获取有关每个视频的详细信息并将这些详细信息推送到多维数组中。获取所有视频后,调用.always()
回调,它将视频排序到按字母顺序排列的播放列表中并附加到页面。
问题
有时会在获取所有视频之前.always()
调用回调。播放列表中有 9 个视频,但有时在触发回调之前只返回 6 或 7 个,这意味着我的播放列表有点短。我已经通过 alert()ing 键的数量和使用控制台对此进行了测试。我看到的是 6-7 个视频将返回,然后回调触发,然后返回剩余的视频。alert()
我的问题:
为什么会这样?我认为在AJAX 请求完成后.always()
会触发回调。这是否意味着所有视频都应该在回调被触发之前返回?我怀疑它与 AJAX 中的“A”有关,但我认为回调的目的是为了解决这个问题。任何能帮助我理解的东西都非常感谢。谢谢!always()