Put*_*uko 8 ajax jquery getjson promise jquery-deferred
我有以下代码从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);
});
});
Run Code Online (Sandbox Code Playgroud)
但是......在最终的应用程序中,我无法控制YouTube中是否仍然存在所有视频,我意识到有时列表中的一个(或几个)视频可能已被删除...或者ID我从DB得到的不正确.
有没有什么方法可以安全地添加到结果变量只有成功whiteout触发$ .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
}
Run Code Online (Sandbox Code Playgroud)
这是一个结果的工作JSFiddle.
归档时间: |
|
查看次数: |
1338 次 |
最近记录: |