How to return value from an asynchronous callback function?

438,356

Solution 1

This is impossible as you cannot return from an asynchronous call inside a synchronous method.

In this case you need to pass a callback to foo that will receive the return value

function foo(address, fn){
  geocoder.geocode( { 'address': address}, function(results, status) {
     fn(results[0].geometry.location); 
  });
}

foo("address", function(location){
  alert(location); // this is where you get the return value
});

The thing is, if an inner function call is asynchronous, then all the functions 'wrapping' this call must also be asynchronous in order to 'return' a response.

If you have a lot of callbacks you might consider taking the plunge and use a promise library like Q.

Solution 2

It makes no sense to return values from a callback. Instead, do the "foo()" work you want to do inside your callback.

Asynchronous callbacks are invoked by the browser or by some framework like the Google geocoding library when events happen. There's no place for returned values to go. A callback function can return a value, in other words, but the code that calls the function won't pay attention to the return value.

Solution 3

If you happen to be using jQuery, you might want to give this a shot: http://api.jquery.com/category/deferred-object/

It allows you to defer the execution of your callback function until the ajax request (or any async operation) is completed. This can also be used to call a callback once several ajax requests have all completed.

Share:
438,356
Gowri
Author by

Gowri

Technologies : Php /MySQL, jQuery, JavaScript Open Source : WordPress, Magento, Symfony, Joomla and Zend framework OWN Android App : Easy Text Twitter : @gchokeen Blog : Code Cocktail Wordpress : @gchokeen

Updated on July 08, 2022

Comments

  • Gowri
    Gowri almost 2 years

    This question is asked many times in SO. But still I can't get stuff.

    I want to get some value from callback. Look at the script below for clarification.

    function foo(address){
    
          // google map stuff
          geocoder.geocode( { 'address': address}, function(results, status) {
              results[0].geometry.location; // I want to return this value
          })
    
        }
        foo(); //result should be results[0].geometry.location; value
    

    If I try to return that value just getting "undefined". I followed some ideas from SO, but still fails.

    Those are:

    function foo(address){
        var returnvalue;    
        geocoder.geocode( { 'address': address}, function(results, status) {
            returnvalue = results[0].geometry.location; 
        })
        return returnvalue; 
    }
    foo(); //still undefined