异步ajax调用完成后如何返回值?

时间:2011-11-30 02:59:04

标签: jquery ajax json cross-domain vimeo

  

可能重复:
  AJAX- response data not saved to global scope?

使用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呼叫
有了这个,您可以进行异步调用。希望这可以帮助。祝大家好运,感谢大家,他们试图回答这个问题!

1 个答案:

答案 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);
    });
});