2017-08-19 3 views
0

I Klasse nennen folgenden CodeFehler bei der Verwendung von Klassen und Versprechen in Nodejs?

var user_ctx = new user(); 
user_ctx 
    .set_email(req.body.email) 
    .then(user_ctx.set_username(req.body.username)) 
    .catch((err)=>{ 
     console.log(err); 
    }); 

und die Klasse definiert wird als

function user() { 
    this.user = {}; 
}; 

user.prototype.set_username = function (username) { 
    return new Promise((fullfill,reject)=>{ 
     this.user.username = username; 
     fullfill(); 
    }); 
}; 

user.prototype.set_email = function (email) { 
    return new Promise((fullfill,reject)=>{ 
     var email_ctx = new email_lib(email); 
     email_ctx 
      .is_valid() 
      .then(function() { 
       this.user.email = email; 
      }) 
      .then(fullfill) 
      .catch(reject); 
    }); 
}; 

folgt das Problem ist, dass die email wir nicht in benutzerdefiniert. Ich habe auch versucht die folgende

user.prototype.set_email = function (email) { 
    return new Promise((fullfill,reject)=>{ 
     var email_ctx = new email_lib(email); 
     var that = this; 
     email_ctx 
      .is_valid() 
      .then(function() { 
       that.user.email = email; 
      }) 
      .then(fullfill) 
      .catch(reject); 
    }); 
}; 

wodurch es that innerhalb Callback-Funktion Referenzierung; aber die E-Mail wird immer noch nicht eingestellt. Habe schon versucht zu loggen, dass die Variable email dort in der Versprechungskette von set_email ist, wo liege ich falsch damit?

+2

'return new Promise ((fullfill, ablehnen) => { this.user.username = username; });' - dies ist ein Versprich, dass es niemals etwas anderes als ein ausstehendes Versprechen geben wird - das hat überhaupt keinen Wert –

+0

@JaromandaX Ich habe vergessen, diesen 'fullfill()' Code zu diesem Block hinzuzufügen, nur um den Code kurz und auf den Punkt zu halten. Das Problem ist mit der Einstellung der Wert der E-Mail in 'this.user' die Einstellung von' username' funktioniert gut, die ich verifiziert, indem Sie eine andere Methode, um den Inhalt der gleichen – georoot

+0

gut drucken, Sie sind auch der klassischen Versprechen schuldig Anti-Muster - https://stackoverflow.com/questions/23803743/what-is-the-explicit-promise-construction-antipattern-and-how-do-i-avoid-it –

Antwort

1

Ihr Code funktioniert nicht wie erwartet, aufgrund mehrerer Fehler/fehlerhafte Umsetzung:

  1. Sie user_ctx.set_username sofort anrufen, ohne das Versprechen warten wird gelöst werden. Anstelle von .then(user_ctx.set_username(req.body.username)) müssen Sie Folgendes verwenden: .then(() => user_ctx.set_username(req.body.username)).
  2. Sie erstellen Promise über Konstruktor, beim Aufrufen des Dienstes email_ctx gibt bereits eine Zusage zurück.
  3. Sie verwenden falsch this. Innerhalb der Funktion zeigt this auf die übergeordnete Funktion.

Die korrekte Umsetzung könnte wie folgt aussehen:

var user_ctx = new user(); 
user_ctx 
    .set_email(req.body.email) 
    .then(() => user_ctx.set_username(req.body.username)) 
    .catch(err => console.log(err)); 

function user() { 
    this.user = {}; 
}; 

user.prototype.set_email = function(email) { 
    var self = this; 
    var email_ctx = new email_lib(email); 
    return email_ctx 
     .is_valid() 
     .then(function() { 
      self.user.email = email; 
     }); 
    }); 
}; 

user.prototype.set_username = function (username) { 
    this.user.username = username; 
}; 
Verwandte Themen