outside for loop var value is undefined

36 views
Skip to first unread message

Catia Matos

unread,
Jul 21, 2017, 9:50:01 PM7/21/17
to nodejs

I'm facing a problem with a value where inside my for cycle it has values like "179" and outside i get always undefined. Why?

var countRepetidos;
if(obj.data.list!={} && obj.data.list.length>0){    
    var aux = obj.data["list"];
    countRepetidos=0;
    for(var i=0;i<aux.length;i++){                              
       Database.Probing.getMacAdress(aux[i]).then(function(data){
            if(data.count>0){
               countRepetidos++;  
               console.log("count repetidos 1",countRepetidos); // value 116
            }                                   
        });
    }
    return resolve(countRepetidos);
}   

console.log("count repetidos 2",countRepetidos);    // value undefined

log :

3|wscontro | count repetidos 1 116
3|wscontro | count repetidos 2 undefined

I try instead of use resolve, use callback but nothing... I saw other answers in javascript but for node.js I cant resolve this problem... I saw the link refering thus question as a duplicate but cant figure out a solution to this case.

tpx1

unread,
Jul 24, 2017, 9:26:58 AM7/24/17
to nod...@googlegroups.com
Hi,

to mentions for you problem. Do it like this:

let countRepetidos = 0;
const count = (data) => {
if(data.count>0){
countRepetidos++;
console.log("count repetidos 1",countRepetidos); // value 116
}
};

Promise.all(aux.map((val) =>
Database.Probing.getMacAdress(val).then(count)).then(() =>
resolve(countRepetidos))

Your problem is a classical async problem. You mix async and sync stuff.
What we do is, to map your aux values to the resolver values from the
query. Now we are able to watch, if all resolver are are finished by
Promise.all and then handle your counting.

A much fancier implementation is this.

const count = (data) => {
return data.count > 0 ? 1 : 0;
};

Promise.all(aux.map((val) =>
Database.Probing.getMacAdress(val).then(count)).then((data) =>
resolve(data.reduce((p,c) => p+c,1));

You also should use Array.isArray(obj.data.list) instead of this -
obj.data.list!={} - in the if statement.

Hope it will help to solve your problem.

Thomas


Am 21.07.2017 um 13:54 schrieb Catia Matos:
>
> 0down votefavorite
> <https://stackoverflow.com/questions/45236919/outside-for-loop-var-value-is-undefined#>
>
>
> I'm facing a problem with a value where inside my for cycle it has
> values like "179" and outside i get always undefined. Why?
>
> |varcountRepetidos;if(obj.data.list!={}&&obj.data.list.length>0){varaux
> =obj.data["list"];countRepetidos=0;for(vari=0;i<aux.length;i++){Database.Probing.getMacAdress(aux[i]).then(function(data){if(data.count>0){countRepetidos++;console.log("count
> repetidos 1",countRepetidos);// value
> 116}});}returnresolve(countRepetidos);}console.log("count repetidos
> 2",countRepetidos);// value undefined|
>
> log :
>
> |3|wscontro |count repetidos 11163|wscontro |count repetidos 2undefined|
>
> I try instead of use resolve, use callback but nothing... I saw other
> answers in javascript but for node.js I cant resolve this problem... I
> saw the link refering thus question as a duplicate but cant figure out a
> solution to this case.
>
> --
> Job board: http://jobs.nodejs.org/
> New group rules:
> https://gist.github.com/othiym23/9886289#file-moderation-policy-md
> Old group rules:
> https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
> ---
> You received this message because you are subscribed to the Google
> Groups "nodejs" group.
> To unsubscribe from this group and stop receiving emails from it, send
> an email to nodejs+un...@googlegroups.com
> <mailto:nodejs+un...@googlegroups.com>.
> To post to this group, send email to nod...@googlegroups.com
> <mailto:nod...@googlegroups.com>.
> To view this discussion on the web visit
> https://groups.google.com/d/msgid/nodejs/743beb4c-731e-4d2c-8055-bdf1804c4595%40googlegroups.com
> <https://groups.google.com/d/msgid/nodejs/743beb4c-731e-4d2c-8055-bdf1804c4595%40googlegroups.com?utm_medium=email&utm_source=footer>.
> For more options, visit https://groups.google.com/d/optout.

DaneiL

unread,
Jul 24, 2017, 9:26:58 AM7/24/17
to nod...@googlegroups.com
You have to put this line

console.log("count repetidos 2",countRepetidos);    // value undefined
before the return function
return resolve(countRepetidos);
var countRepetidos;
if(obj.data.list!={} && obj.data.list.length>0){    
    var aux = obj.data["list"];
    countRepetidos=0;
    for(var i=0;i<aux.length;i++){                              
       Database.Probing.getMacAdress(aux[i]).then(function(data){
            if(data.count>0){
               countRepetidos++;  
               console.log("count repetidos 1",countRepetidos); // value 116
            }                                   
        });
    }
    console.log("count repetidos 2",countRepetidos); 
    return resolve(countRepetidos);
}   

--
Job board: http://jobs.nodejs.org/
New group rules: https://gist.github.com/othiym23/9886289#file-moderation-policy-md
Old group rules: https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
---
You received this message because you are subscribed to the Google Groups "nodejs" group.
To unsubscribe from this group and stop receiving emails from it, send an email to nodejs+unsubscribe@googlegroups.com.
To post to this group, send email to nod...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/nodejs/743beb4c-731e-4d2c-8055-bdf1804c4595%40googlegroups.com.

For more options, visit https://groups.google.com/d/optout.



--
[]'s

Zlatko

unread,
Jul 24, 2017, 9:26:58 AM7/24/17
to nodejs
The problem is that your last console.log line runs before anything else.

I don't see the rest of the code, but I suspect if you move your return resolve(countRepetidos); 2 lines up (right behind that if(data.count>0) {} block), your promise will resolve proper value.

Likewise, if you put the console log there, it's going to work.
Reply all
Reply to author
Forward
0 new messages