2016-07-28 7 views
0

Ich versuche, zu einem/user/create route Daten von einem Formular, das alles gut geht und dann eins nach dem anderen überprüfen, dass die Daten gültig und in einigen Fällen einzigartig in der Datenbank sind. Hier ist, was ich verwende, um den Benutzer und die E-Mail-Adresse zu überprüfen, die auf dem Registrierungsformular eingegeben wurden.Versprechungen, die nicht auf vorherige Anweisungen warten, um abzuschließen.

Die Funktion scheint richtig abzufragen, aber am Ende sammelt meine console.log der Fehlermeldungen, die ich sammle, nur den ersten Eintrag.

// Check if variable is already is available or not 
var existsInDatabase = function(field, value){ 

    var deferred = Q.defer(); 
    var query = {}; 
    var errorMessage = {}; 

    query[field] = value; 

    User.find(query, function(err, docs){ 
    // If it finds it, then set a message for already existing 
    if(docs){ 
     errorMessage = {'type': 'alert', 'body': value + ' already exists in the database.'} 
     deferred.resolve(errorMessage); 
    } else { 
     deferred.reject(value + ' was not found in the database'); 
    } 

    }); 
    return deferred.promise; 
}; 

Hier ist, wo ich die Passwörter überprüfen, ob sie übereinstimmen.

var doPasswordsMatch = function(password, confirmed){ 
    var deferred = Q.defer(); 

    console.log('Values passed into doPasswordsMatch() function:', password + ' ' + confirmed); 

    if(password !== confirmed){ 
    errorMessage = {'type': 'alert', 'body': 'The two passwords you entered do not match'}; 
    deferred.resolve(errorMessage); 
    }; 

    return deferred.promise; 
} 

Hier ist meine Route mit der. Dann Verkettung.

router.post('/user/create', function(req, res){ 

    var errorMessages = []; 

    existsInDatabase('userName', req.body.username) 
    .then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } }) 
    .then(existsInDatabase('userEmail', req.body.email)) 
    .then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } }) 
    .then(doPasswordsMatch(req.body.password, req.body.confirmedPassword)) 
    .then(function(errorMessage){ if (errorMessage) { errorMessages.push(errorMessage) } }) 
    .then(function(){ console.log(errorMessages); }); 

}); 

Ich denke, wo ich kämpfen bin, ist die Verkettung von .then und wie etwas zu verhindern, es sei denn, alles auslösenden, bevor es abgeschlossen ist.

+0

Warum passiert man manchmal Funktionen und verspricht manchmal "dann"? Würden Sie erwarten, dass '.then (console.log (errorMessages))' funktioniert? – Bergi

Antwort

1

then() übernimmt Funktionen als Parameter (full specification), aber Sie versprechen Versprechen für Ihre 2. und 4. . Es sollte funktionieren, wenn Sie sie stattdessen in anonyme Funktionen einbinden.

... 
.then(function() { return existsInDatabase('userEmail', req.body.email); }) 
... 
.then(function() { return doPasswordsMatch(req.body.password, req.body.confirmedPassword); }) 
... 

return ist, so dass die von existsInDatabase() und doPasswordsMatch() zurück Versprechen, bevor sie zu dem jedoch

nächsten then() aufgelöst werden, können Sie die Art und Weise Ihre Logik eingerichtet ist, überdenken müssen. So wie es derzeit ist, wenn die Passwörter übereinstimmen, wird der nächste .then nie aufgerufen, und die Logik bleibt einfach hängen.

Verwandte Themen