Suvodeep Dubey
Suvodeep Dubey

Reputation: 119

Superagent Not Returning Value From Then

superagent.get(URL).then((res) => {
  for(let i in res.body) {
    if (i==='has_rejected_advisories') {
      console.log(i + "="+res.body[i]);
    }
  }
})
.catch((err) => err.message));

My result is:

has_rejected_advisories=false

But I am not able to use res.body[i] outside this function, i.e I want superagent function to return this value in a boolean variable to use it elsewhere.

ex.

a = superagent.get(URL).then((res) => {
  for(let i in res.body) {
    if(i==='has_rejected_advisories') {
      console.log(i + "="+res.body[i]);
    }
  }
})
.catch((err) => err.message));

if(a===false){/*do this*/}

Upvotes: 0

Views: 1160

Answers (3)

Suvodeep Dubey
Suvodeep Dubey

Reputation: 119

In constructor:

this.state = {a:null};

In some function:

superagent.get(URL).then(
(res) => {for(let i in res.body) 
{
   if(i === 'has_rejected_advisories')
     {
        this.setState({a:res.body[i]})
     }
 }
  }).catch((err)=>(err.message));

In render: console.log(this.state.a);

Inside then() the value could be used using state variable but there are many scenarios we could not use them, like if we want to perform all the operations under constructor i.e Initializing state variable, calling superagent and changing the state variable and using the state variable.

Upvotes: 0

KidKode
KidKode

Reputation: 189

On top of jerelmiller's great advice you need to note the following:

Try this:

create a global var assuming it's a string

 var mysares = ""

This example will only bring back 1 string back of everything!! Not single element. Also if you can't get the standard Fetch() to work don't try other methods like axios or superagents. Now use our global like so:

  superagent.get(URL).then((res) => {
      for(let i in res.body) {
        if (i==='has_rejected_advisories') {
          //Add comments as will help you
          //to explain to yourself and others 
          //what you're trying to do
          //That said if this iteration produces
          //correct data then you're fine
          //push my result as a string
          mysares = res.body[i];
          //infact what's in row 1?
          mysares = res.body[0];
          //Actually I code my own JSON!!
          mysares = res.body[1];
          console.log(i + "="+mysares);
        }
      }
    })
    .catch((err) => err.message));

Now you can do whatever:

 if(mysares===false){/*do this*/
   alert(playDuckHunt());}

Things to note: res.body[i] is an iteration You cannot use it outside of the function Because: It's local to that function You don't know what position of 'i' is even if you could use it as you will be outside of your loop

One last thing: Loops loop through loops or arrays etc. So (in real world) you can't just request the value of the loop unless you agree the position of data to be released, type,and bucket (where it's going to be displayed or not).

Hope this helps!

PS> we need to know where 'has_rejected_advisories' is in the JSON so send us your json url as it must be a column/obj header name. Or it's any old 'a' then var a can be your "false"

Upvotes: 1

jerelmiller
jerelmiller

Reputation: 1737

This is because the superagent.get(url) call is asynchronous. The value given to a is a Promise

Since this is async, the if (a === false) is actually executing before the function body passed to .then. You will either need to move this logic to the .then function, or use something like async/await if you like the synchronous looking syntax.

Upvotes: 1

Related Questions