0

De Firebase fonctions de Cloud que je fais requête dans Firebase en temps réel DB comme ceci:somme forEach avec fonction flèche donne des résultats inattendus dans Firebase en temps réel Base de données

let logs = this.firebase.database() 
.ref('logs') 
.orderByChild("userId").equalTo(userId) 
.once('value'); 

données Retourné:

{ 
    "id1abc": { 
    "myValue": 1, 
    "userId": "abc" 
    }, 
    "id2abc": { 
    "myValue": 2, 
    "userId": "abc" 
    }, 
    "id3abc": { 
    "myValue": 3, 
    "userId": "abc" 
    } 
} 

Requête renvoie un couple entrées dont les valeurs que je voudrais additionner:

let loggedVal = 0; 
logs.forEach(log => { 
    loggedVal += log.val().myValue; 
}); 
return loggedVal; 

Fonction flèche à l'intérieur forEach me donne la valeur correcte dans ce cas (Sum est égal à 6).

Mais quand je supprimer les parenthèses comme ici:

let loggedVal = 0; 
logs.forEach(log => loggedVal += log.val().myValue); 
return loggedVal; 

valeur retournée est somme non, mais juste valeur du premier élément que je suis itérer (loggedVal == 6). Quelqu'un peut-il expliquer d'où vient la différence?

+1

Comment pouvez-vous utiliser 'forEach' dans un' Object' en premier lieu? Les données renvoyées que vous nous avez montrées ne sont pas des 'Array' éligibles à' Array.forEach'. –

Répondre

3

Selon les firbase forEach docs,

Vous pouvez annuler l'énumération à tout moment en ayant votre déclaration de fonction de rappel forEach vrai.

Ici, dans votre second cas,

logs.forEach(log => loggedVal += log.val().myValue); 

Vous retournez une valeur dans votre première itération (parce you are not using parenthesis), qui est considéré comme vrai. Par conséquent, il arrête l'itération, donc vous n'obtenez pas la somme mais la première valeur.

+1

Je savais que ce serait quelque chose dans les bases de JavaScript! Juste ne pouvait pas trouver une bonne question à poser. Je vous remercie! –

0

Ici, il est ce qu'il devrait ressembler à

const logs = { 
    id1abc: { 
    myValue: 1, 
    userId: 'abc', 
    }, 
    id2abc: { 
    myValue: 2, 
    userId: 'abc', 
    }, 
    id3abc: { 
    myValue: 3, 
    userId: 'abc', 
    }, 
}; 

Object.keys(logs).reduce((tmp, x) => tmp + logs[x].myValue, 0); 
1

vous comprenez mal sur le format de la fonction de flèche.

la 1ère:

let loggedVal = 0; 
logs.forEach(log => { 
    loggedVal += log.val().myValue; 
}); 
return loggedVal; 

il est égal à ES5:

let loggedVal = 0; 
logs.forEach(function(log){ 
    loggedVal += log.val().myValue; 
}); 

return loggedVal; 

mais le 2ème:

let loggedVal = 0; 
logs.forEach(log => loggedVal += log.val().myValue); 
return loggedVal; 

il est égal à l'ES5:

let loggedVal = 0; 
logs.forEach(function(log){ 
    return loggedVal += log.val().myValue); 
}); 
return loggedVal; 

flèche fonction => abc() signifie { return abc()}, mais => { abc } cela signifie {abc(); return;}.

un comme document de firebase:

Vous pouvez annuler l'énumération à tout moment en ayant votre déclaration de fonction de rappel forEach vrai.

au premier article: return loggedVal += log.val().myValue); // === true, de sorte qu'il a arrêté votre récursif .forEach.

p.s: Quelqu'un aussi mal comprendre => { abc } égal à { return { abc :abc} }