2011-07-23 5 views
0

J'utilise now.js et Mongoose dans un projet de nœud et j'ai du mal à accéder à l'objet this.now à l'intérieur d'une fonction mongoose. Par exemple.La variable JavaScript (node.js) n'est pas accessible dans l'appel de fonction interne. now.js

everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); //this will work 
    Project.findOne({'_id':project_id}, function(err, project){ 
    if(project){ 
     this.now.talk(); // this will not work "TypeError: Cannot call method 'bark' of undefined" 
    }; 
    }); 
}; 

Répondre

4

Modifier le code à ceci:

everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); // this will work 
    var that = this; // save 'this' to something else so it will be available when 'this' has been changed 
    Project.findOne({'_id':project_id}, function(err, project){ 
    if(project){ 
     that.now.talk(); // use local variable 'that' which hasn't been changed 
    }; 
    }); 
}; 

l'intérieur de votre fonction intérieure, la this est probablement être mis à autre chose. Ainsi, pour préserver la valeur à laquelle vous voulez accéder, vous l'attribuez à une variable locale différente qui sera disponible dans la fonction interne.

+0

des thats ahhhh brillant ce « que » est tout au sujet. –

1
everyone.now.joinDoc = function (project_id){ 
    this.now.talk(); // this will work 
    Project.findOne({'_id':project_id}, (function(tunnel, err, project){ 
    if(project){ 
     this.now.talk(); 
    }; 
    }).bind(this, "tunnel")); // overwrite `this` in callback to refer to correct `this` 
}; 

Utilisez Function.prototype.bind pour définir la valeur de this à la valeur que vous voulez

+0

est ce meilleur style que d'utiliser 'that' comme suggéré par jfriend00? –

+0

@beck Je l'appellerais préférence personnelle. Vous pouvez également utiliser '.bind' pour intégrer des paramètres supplémentaires dans le tunnel. (Voir édition) – Raynos

Questions connexes