使用vimeo API获取vimeo视频缩略图的函数内部:
function getVimeoThumb(){
var t = new Array();
$.ajax({
'url' : 'http://vimeo.com/api/v2/video/' + id + '.json?callback=?',
'dataType' : 'json',
'async' : false,
'type' : 'get',
'success' : function(data) {
t['img'] = data[0].thumbnail_large;
t['src'] = 'vimeo';
t['id'] = id;
},
'error' : function(){
t['src'] = 'vimeo';
t['img'] = '';
t['id'] = id;
}
});
return t;
}
即使我将“async”值设置为false,它仍然不是同步的,因此变量“t”未定义。请参阅jquery.com:
“跨域请求和dataType:”jsonp“请求不支持 同步操作。“
还有其他解决方案吗?
更新:
我需要它来返回变量而不是调用其他函数。因为调用它的另一个函数等待它返回值。这是一种功能,在整个网站中使用。
解决方案:(对未来的访问者)
由于你不能对不同的域进行异步调用,我创建了一个服务器端代码(在同一个域上)来对vimeo进行api调用。过程如下:
ajax调用本地服务器端脚本 - > api调用vimeo api - >得到任何回报 - >将其返回到ajax呼叫
有了这个,您可以进行异步调用。希望这可以帮助。祝大家好运,感谢大家,他们试图回答这个问题!
答案 0 :(得分:2)
JSONP不同步,因为它基本上等于......
<script src="http://vimeo.com/api/v2/video/12345.json?callback=cb12345"></script>
该脚本的内容是......
cb12345({ /* ... json data ... */ });
所以你基本上有两个选择:
拥抱异步
假设这个$ .ajax代码在一个函数中(在旁注$ $ .ajax是非常没有意义的,使用$ .getScript是同样的事情,没有jQuery尝试更多的行为)。
function GetVideoThumb(id, callback) {
$.getScript('http://vimeo.com/api/v2/video/' + id + '.json', function(data){
callback({ img: data[0].thumbnail_large, src: 'vimeo', id: id });
});
}
这意味着无论何时调用GetVideoThumb
函数,都需要指定一个可以处理的回调函数。
所以说你的代码看起来像这样......
$('#myelem').click(function() {
var thumb = GetVideoThumb(1234);
$(this).attr('src', thumb.img);
});
你会把它改成更像这样......
$('#myelem').click(function() {
var that = this;
GetVideoThumb(1234, function(thumb) {
$(that).attr('src', thumb.img);
});
});