我有以下代码,这些代码是从YouTube视频ID数组中获取JSON的。当所有视频都存在并且查询成功时,它非常有用。它发送几个getJSON请求,当所有请求都完成时… $ .when.done() 触发,我可以处理结果数据。
var results = {}, promises = []; $(document).ready(function() { var vids = [ 'ozj2-bnTL3s', 'EAZ4Tlt8MQ4', 'Xn9o7cxqVoA' // ,'this-videoid-doesnot-exists' ], url = 'http://gdata.youtube.com/feeds/api/videos/{{vid}}?v=2&alt=json'; $.each(vids, function(idx, vid){ var u = url.replace('{{vid}}', vids[idx]), p = null; p = $.getJSON( u ).done(function(data) { results[vid] = data.entry; }); promises.push(p); }); $.when.apply($, promises).done(function(){ console.log(results); }); });
但是…在最终应用中,我无法控制YouTube中是否还存在所有视频,我意识到有时候列表中的一个(或几个)视频可能已被删除…或ID我从数据库得到的是不正确的。
有什么方法可以安全地仅将成功变白触发$ .when.fail()的视频添加到结果变量中? 然后等待所有查询结束…
我的意思是,我的最终目标是从存在的视频中获取数据(已成功检索其数据),并且以某种方式忽略那些不存在或不可用的视频…而且我认为不正确现在该怎么做。
任何想法/方法将不胜感激。TIA! 您可以在 此JSFiddle中找到代码
不幸的是,jQuery没有此功能。
很高兴,您可以自己轻松实现它。
var url = 'http://gdata.youtube.com/feeds/api/videos/{{vid}}?v=2&alt=json'; function getVideo(vid){ var u = url.replace('{{vid}}', vid); return $.getJSON( u ).then(function(res){ return {video:vid,result:res.entry}; }); } var promises = ['ozj2-bnTL3s','EAZ4Tlt8MQ4',"doesn'texist"].map(getVideo); some(promises).then(function(results){ for(var i = 0; i < results.length; i++) { console.log(results[i]); // log } }); // get a hook on when all of the promises resolve, some fulfill // this is reusable, you can use this whenever you need to hook on some promises // fulfilling but all resolving. function some(promises){ var d = $.Deferred(), results = []; var remaining = promises.length; for(var i = 0; i < promises.length; i++){ promises[i].then(function(res){ results.push(res); // on success, add to results }).always(function(res){ remaining--; // always mark as finished if(!remaining) d.resolve(results); }) } return d.promise(); // return a promise on the remaining values }
这是结果的有效JSFiddle。