2016-04-14 10 views
-1

私はWebアプリケーションのnode.jsバックエンドをビルドしています。フォームを送信すると、私はさまざまなバリデーションを行います。そのうちの一つは、招待状はすでに同じメールアドレスで存在しているかどうかを確認することです。私はこれを呼び出すときしかし、私は応答がその速くないと思いますし、それを、jsのif文の中で結果を待つ方法は?

私はこの機能を作成した(機能をisUserAlreadyInvited)チェックがtrueを返しても次のステートメントに移ります。ここではどのように

//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

[非同期呼び出しからの応答を返すにはどうすればよいですか?](http://stackoverflow.com/questions/14220321/how-do-i-return-非同期呼び出しからの応答) –

+0

これは私の意見では素晴らしい答えではありませんので、コメントとして書いていますが、あなたの代わりに(!(isUserAlreadyInvited(email、user_id))))それ以外の仕事? –

+0

@AldenBe 'isUserAlreadyInvited'は非同期関数であるため、いいえです。以前にリンクした質問を参照してください。 –

答えて

0

二リターン:

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

    } 

は、この関数内

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

を定義し、isUserAlreadyInvited()の戻り値とは何もありません。

あなたのisUserAlreadyInvited()は、非同期的に扱われる必要がある非同期関数です。コールバック関数をパラメータとして取得する必要があります。その代わりにコールバックが呼び出されるfunction(err, user) {}

関連する問題