2016-04-14 6 views
-1

Ich baue ein node.js Backend für eine Webapp und wenn ich ein Formular abschicke, mache ich verschiedene Validierungen. Einer von ihnen ist bereits, wenn eine Einladung mit der gleichen E-Mail-Adresse existiert zu überprüfen. (isUserAlreadyInvited Funktion)Wie auf Ergebnisse innerhalb einer if-Anweisung in js warten?

ich eine Funktion dafür geschaffen, aber wenn ich das nennen, ich denke, die Antwort nicht so schnell ist und es bewegt sich nur zur nächsten Anweisung, selbst wenn der Test wahr zurückgibt. Wie

//Loop through emails one by one 
    var emails_to_invite = ["[email protected]","invalid.com"]; 
    var response_items = []; 
    async.each(emails_to_invite, 
     function(email, callback){ 

      //Response item 
      var response_item = {} 
      response_item.email = email;     

      //Validate 
      if(Joi.validate({ email: email }, apiSchema).error) { 
       response_item.error = "not valid email"; 
       response_items.push(response_item); 
       callback(); 
      } else if(email == user.email) { 
       response_item.error = "Sending an invitation to your own email is kinda dumb"; 
       response_items.push(response_item); 
       callback(); 
      } else if(isUserAlreadyInvited(email,user_id)) { 
       response_item.error = "already invited"; 
       response_items.push(response_item); 
       callback(); 
      } else { 
       sendInvitationEmail(email,user_id,null,null,function(invitation_code){ 
        if(invitation_code) { 
         response_item.invitationCode = invitation_code; 
        } else { 
         response_item.error = "server error"; 
        } 
        response_items.push(response_item);  
        callback();  
       }); 
      }; 
     }, 
     function(err){ 

      //Return response 
      res.status(200).send(response_items); 

     } 
    ); 

    function isUserAlreadyInvited(email,invited_by) { 
     User.findOne({ 
      email: email, 
      invited_by: invited_by 
     }, function(err, user) { 
      if(err) { 
       return false; 
      } else { 
       return true; 
      } 
     }); 

    } 
+1

Mögliche Duplikat von [Wie gebe ich die Antwort von einem asynchronen Aufruf zurück?] (Http://stackoverflow.com/questions/14220321/how-do-i-return- the-response-from-async-anruf) –

+0

Das ist meiner Meinung nach keine gute Antwort also schreibe ich es als Kommentar, würde aber sonst wenn (! (isUserAlreadyInvited (email, user_id))) statt deiner sonst arbeiten? –

+0

@AldenBe Nein, weil 'isUserAlreadyInvited' eine asynchrone Funktion ist. Siehe die Frage, mit der ich zuvor verbunden war. –

Antwort

0

Zwei kehrt hier:

function isUserAlreadyInvited(email,invited_by) { 
     User.findOne({ 
      email: email, 
      invited_by: invited_by 
     }, function(err, user) { 
      if(err) { 
       return false; 
      } else { 
       return true; 
      } 
     }); 

    } 

sind in dieser Funktion definiert

function(err, user) { 
      if(err) { 
       return false; 
      } else { 
       return true; 
      } 
     } 

und haben nichts mit Rückgabewert von isUserAlreadyInvited().

Anscheinend ist Ihre isUserAlreadyInvited() eine asynchrone Funktion, die asynchron behandelt werden muss - es sollte Callback-Funktion als Parameter erhalten. Dieser Rückruf wird anstelle von function(err, user) {}

Verwandte Themen