我正在编写一个函数,它必须使用embed.ly API从给定视频中获取缩略图信息,但是目前该函数在从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控制台时,我可以看到:
这显然是错误的顺序。
非常感谢任何帮助!
答案 0 :(得分:27)
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!
});
您可以使用deferred object,并聆听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!
})
答案 1 :(得分:1)
你可以简单地使用$.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
导致调用函数。因为,$.getJSON
是异步的。
答案 2 :(得分:0)
使用异步/等待
async function getThumbnail(vUrl) {
const data = await $.getJSON("http://api.embed.ly/1/oembed?key=:key&url="+vUrl);
return {
thumbnail:data.thumbnail_url,
vurl:vUrl
}
}
async function someFunction() {
let thumbNail = await getThumbnail('the_vurl_');
}