函数等待返回,直到$ .getJSON完成

我正在编写一个函数,它必须使用embed.ly API从给定video中获取缩略图信息,但是目前该函数在从API获得JSON结果之前返回一个值。

我使用以下代码:

function getThumbnail(vUrl) { var thumbnail = ''; var title = ''; var caption = ''; var content = ''; $.when( $.getJSON("http://api.embed.ly/1/oembed?key=:key&url="+vurl) ).then(function(data){ var thumbnail = data.thumbnail_url; console.log(thumbnail); return { thumbnail:thumbnail, vurl:vurl } }); } 

但是,当使用Chrome Javascript控制台时,我可以看到:

  1. 该函数被调用
  2. undefined返回
  3. XHR请求已完成
  4. 变量缩略图内容显示在控制台中

这显然是错误的顺序。

任何帮助是极大的赞赏!

更新的答案

getJSON返回一个promise(一个只读的延迟),所以你可以听它。 但是,由于您需要一些后期处理,您需要链接一个允许您更改已解析值的then

 // Now using `then` function getThumbnail(vUrl){ return $.getJSON("http://api.embed.ly/1/oembed?key=:key&url="+vurl).then(function(data){ return { thumbnail:data.thumbnail_url, vurl:vurl } }); } //and in your call will listen for the custom deferred's done getThumbnail('the_vurl_').then(function(returndata){ //received data! }); 

原始答案

您可以使用延迟对象 ,并侦听done()

 function getThumbnail(vUrl) { //create our deferred object var def = $.Deferred(); //get our JSON and listen for done $.getJSON("http://api.embed.ly/1/oembed?key=:key&url="+vurl) .done(function(data){ //resolve the deferred, passing it our custom data def.resolve({ thumbnail:data.thumbnail_url, vurl:vurl }); }); //return the deferred for listening return def; } //and in your call will listen for the custom deferred's done getThumbnail('the_vurl_') .done(function(returndata){ //received data! }); 

你可以返回$.getJSON的延迟来获取原始数据。 但由于对对象进行“后处理”,因此需要自定义延迟。 您还可以将回调传递给getThumbnail()

 function getThumbnail(vUrl,callback) { $.getJSON("http://api.embed.ly/1/oembed?key=:key&url="+vurl,function(returndata){ callback(returndata); }); } getThumbnail('the_vurl_',function(returndata){ //received data! }) 

你可以简单地使用$.getJSON的回调,如下所示:

 function result(res) { console.log(res); } function getThumbnail(vUrl) { var thumbnail = ''; var title = ''; var caption = ''; var content = ''; $.getJSON("http://api.embed.ly/1/oembed?key=:key&url="+vurl, function(data) { var thumbnail = data.thumbnail_url; console.log(thumbnail); var result = { thumbnail:thumbnail, vurl:vurl }; // passing the result to a function getResult(result); }); } 

注意:

你看到我正在调用一个函数来传递结果,你试图return ,但你不能return结果return给调用函数。 因为, $.getJSON是异步的。