jquery – 使用promises数组和$.when忽略AJAX错误

前端之家收集整理的这篇文章主要介绍了jquery – 使用promises数组和$.when忽略AJAX错误前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有以下代码从YouTube视频ID数组中获取 JSON.当所有视频都存在且查询成功时,它的效果很好.它发送了几个getJSON请求,当它们全部完成时… $.when.done()触发,我可以处理结果数据.
  1. var
  2. results = {},promises = [];
  3.  
  4. $(document).ready(function() {
  5.  
  6. var
  7. vids = [
  8. 'ozj2-bnTL3s','EAZ4Tlt8MQ4','Xn9o7cxqVoA'
  9. //,'this-videoid-doesnot-exists'
  10. ],url = 'http://gdata.youtube.com/Feeds/api/videos/{{vid}}?v=2&alt=json';
  11.  
  12. $.each(vids,function(idx,vid){
  13. var
  14. u = url.replace('{{vid}}',vids[idx]),p = null;
  15.  
  16. p = $.getJSON( u ).done(function(data) {
  17. results[vid] = data.entry;
  18. });
  19.  
  20. promises.push(p);
  21. });
  22.  
  23. $.when.apply($,promises).done(function(){
  24. console.log(results);
  25. });
  26.  
  27. });

但是……在最终的应用程序中,我无法控制YouTube中是否仍然存在所有视频,我意识到有时列表中的一个(或几个)视频可能已被删除…或者ID我从DB得到的不正确.

有没有什么方法可以安全地添加到结果变量只有成功whiteout触发$.when.fail()的视频?并等待所有查询完成…

我的意思是,我的最终目标是从存在的视频(成功检索其数据的那些)中获取数据,并以某种方式忽略那些不存在或不可用的视频……我认为不对现在怎么做.

任何想法/方法都会受到欢迎. TIA!
你可以在this JSFiddle找到代码

解决方法

不幸的是,jQuery没有这个功能.

很高兴,你可以很容易地自己实现它.

  1. var url = 'http://gdata.youtube.com/Feeds/api/videos/{{vid}}?v=2&alt=json';
  2. function getVideo(vid){
  3. var u = url.replace('{{vid}}',vid);
  4. return $.getJSON( u ).then(function(res){
  5. return {video:vid,result:res.entry};
  6. });
  7. }
  8. var promises = ['ozj2-bnTL3s',"doesn'texist"].map(getVideo);
  9.  
  10. some(promises).then(function(results){
  11. for(var i = 0; i < results.length; i++) {
  12. console.log(results[i]); // log
  13. }
  14. });
  15.  
  16.  
  17.  
  18. // get a hook on when all of the promises resolve,some fulfill
  19. // this is reusable,you can use this whenever you need to hook on some promises
  20. // fulfilling but all resolving.
  21. function some(promises){
  22. var d = $.Deferred(),results = [];
  23. var remaining = promises.length;
  24. for(var i = 0; i < promises.length; i++){
  25. promises[i].then(function(res){
  26. results.push(res); // on success,add to results
  27. }).always(function(res){
  28. remaining--; // always mark as finished
  29. if(!remaining) d.resolve(results);
  30. })
  31. }
  32. return d.promise(); // return a promise on the remaining values
  33. }

这是结果的working JSFiddle.

猜你在找的jQuery相关文章