function wait with return until $.getJSON is finished

前端 未结 3 1238
我在风中等你
我在风中等你 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!
    })
    
    0 讨论(0)
  • 2020-12-05 05:26

    you can simple use $.getJSON's callback like following:

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

    NOTE:

    You see that I'm calling a function to pass the result, where you are trying to return, but you can't return result to caller function. Because, $.getJSON is asynchronous.

    0 讨论(0)
  • 2020-12-05 05:28

    Using Async/Await

    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_');
    }
    
    0 讨论(0)
提交回复
热议问题