Quelle est la portée du rappel javascript et les fonctions anonymes?
-
26-09-2019 - |
Question
J'ai écrit le code suivant à l'aide Node.js et Riak-js . J'ai un walk
de fonction récursive qui devrait être une liste de documents JSON, mais retourne à la place une liste vide ... pourquoi? comment fixer?
require('riak-js');
var walk = function(bucket, key, list){
if(list == undefined){
var list = new Array();
}
db.get(bucket, key)(function(doc, meta){
list.push(doc);
if(meta.links.length > 0 && meta.links[0].tag == 'child'){
walk(bucket, meta.links[0].key, list);
}
});
return list;
}
familytree = walk('smith', 'walter', []);
Merci à l'avance!
La solution
Vous obtenez un tableau vide parce que db.get()
est asynchrone. Il retourne immédiatement sans attendre le rappel à invoquer. Par conséquent, lorsque l'interpretor atteint l'instruction de return list
, list
est encore un tableau vide.
Il est un concept fondamental dans Node.js (et même dans les scripts de navigateur) que tout est asynchrone (sans blocage).
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow