How to return a value from a function that calls $.getJSON?
Asked Answered
C

4

11
function lookupRemote(searchTerm)
{
   var defaultReturnValue = 1010;
   var returnValue = defaultReturnValue;

   $.getJSON(remote, function(data)
   {
      if (data != null)
      {
           $.each(data.items, function(i, item)
           {
               returnValue = item.libraryOfCongressNumber;
           });
      }
    });
    return returnValue;
}

Why is the returnValue from this function alway equal to the default value set at the beginning of the function and never to the value retrieved from the JSON lookup?

Churchill answered 17/11, 2010 at 1:10 Comment(2)
See #3537934Alrick
possible duplicate of How to return the response from an AJAX call?Aedes
P
14

This happens because that callback function (function(data) {...}) runs later when the response comes back...because it's an asynchronous function. Instead use the value once you have it set, like this:

function lookupRemote(searchTerm)
{
    var defaultReturnValue = 1010;
    var returnValue = defaultReturnValue;
    $.getJSON(remote, function(data) {           
        if (data != null) {
              $.each(data.items, function(i, item) {                 
                    returnValue = item.libraryOfCongressNumber;
              });
        }
        OtherFunctionThatUsesTheValue(returnValue);
     });
}

This is the way all asynchronous behavior should be, kick off whatever needs the value once you have it...which is when the server responds with data.

Presbyterate answered 17/11, 2010 at 1:11 Comment(0)
P
18

If you don't want to use asynchronous function, better use the following:

function getValue(){
   var value= $.ajax({ 
      url: 'http://www.abc.com', 
      async: false
   }).responseText;
   return value;
}

This function waits until the value is returned from the server.

Pricking answered 11/6, 2013 at 0:57 Comment(1)
+1 This works like charm if you need synchronous behaviour out of. It will return JSON into String if don't want to change it to string just do JSON.parse(value)Mayhem
P
14

This happens because that callback function (function(data) {...}) runs later when the response comes back...because it's an asynchronous function. Instead use the value once you have it set, like this:

function lookupRemote(searchTerm)
{
    var defaultReturnValue = 1010;
    var returnValue = defaultReturnValue;
    $.getJSON(remote, function(data) {           
        if (data != null) {
              $.each(data.items, function(i, item) {                 
                    returnValue = item.libraryOfCongressNumber;
              });
        }
        OtherFunctionThatUsesTheValue(returnValue);
     });
}

This is the way all asynchronous behavior should be, kick off whatever needs the value once you have it...which is when the server responds with data.

Presbyterate answered 17/11, 2010 at 1:11 Comment(0)
E
4

The function you pass to getJSON is run when the response to the HTTP request arrives which is not immediately.

The return statement executes before the response, so the variable hasn't yet been set.

Have your callback function do what needs doing with the data. Don't try to return it.

Elbertine answered 17/11, 2010 at 1:13 Comment(0)
E
1
const getJson = (path) => {
  return new Promise((resolve) => {
    $.getJSON(path, function (data) {
      setTimeout(() => {
        resolve(data);
      }, 1);
    });
  })
}
var result = await getJson('test.json');
console.log(result);
Ethnic answered 5/10, 2022 at 10:15 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.