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

xor*_*zor 22 javascript jquery function

我正在编写一个函数,它必须使用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
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

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

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

这显然是错误的顺序.

任何帮助是极大的赞赏!

Jos*_*eph 28

更新的答案

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!
});
Run Code Online (Sandbox Code Playgroud)

原始答案

您可以使用延迟对象,并听取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!
    });
Run Code Online (Sandbox Code Playgroud)

您可以返回$.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!
})
Run Code Online (Sandbox Code Playgroud)


小智 7

使用异步/等待

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_');
}
Run Code Online (Sandbox Code Playgroud)