function wait with return until $.getJSON is finished

前端 未结 3 1241
我在风中等你
我在风中等你 2020-12-05 05:07

I am writing a function which has to get the thumbnail information from a given video using the embed.ly API, however currently the function returns a value before it even g

3条回答
  •  鱼传尺愫
    2020-12-05 05:19

    Updated answer

    getJSON returns a promise (a read-only deferred), so you can listen to it. But since you need some post-processing, you'd want to chain a then which allows you to alter the resolved value.

    // 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!
    });
    

    Original answer

    You can use a deferred object, and listen for the 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!
        });
    

    You could return $.getJSON's deferred to get the raw data. But because of "post-processing" into an object, the custom deferred is needed. You could also pass a callback to 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!
    })
    

提交回复
热议问题