2017-12-06 7 views
-1

このコードでは、変数adminNameとadminPasswordはif文の実行前に値を取得する必要があります。しかし、文がそのハンドラ関数の前に実行されている場合検証が機能しないのはなぜですか?Nodejs:約束が得られるのを待つ

function validateAdminLogin() 
{ 

var adminName=""; 
var adminPassword=""; 

var isValid=true; 

var UserDAO = require('./js/DAO/UserDAO'); 
var wait=require('wait.for-es6'); 
var admin=document.getElementById("adminform").elements.namedItem("username").value; 
var adminPwd=document.getElementById("adminform").elements.namedItem("pwd").value; 




    UserDAO.getAdminCredentials().then(function(rows){ 

    adminName= rows.username; 
    adminPassword=rows.password; 

    alert(admin+"----"+adminName); 

    },function(error){ 
    alert(error); 
    console.log(error); 
    }); 



    //alert(admin+"-------"+adminName); 

if(admin!==adminName) 
{ 
alert("Invalid username"); 
isValid=false; 
} 


if(adminPwd!==adminPassword) 
{ 
alert("Invalid password"); 
isValid=false; 
} 

return isValid; 
} 

また、私は約束を書いているコードを含めています。

getAdminCredentials: function() 
{ 
    var deferred = q.defer(); 

    $query = "SELECT * FROM `user` where type='administrator' "; 

    connection.connect(function(err) { 

     if(err){ 
      console.log(err.code); 
      console.log(err.fatal); 
     } 

    // console.log("Successfully connected."); 
    }); 

    connection.query($query, function(err, rows, fields) { 
     if(err){ 
      console.log("An error ocurred performing the query."); 
      console.log(err); 
      deferred.reject(err); 
      return; 
     } 
     else 
      { 
      console.log("Query succesfully executed"); 
      userDTO.setUserId(rows[0].user_id); 
      userDTO.setUsername(rows[0].username); 
      userDTO.setPassword(rows[0].password); 

      deferred.resolve(userDTO); 

      } 



    }); 


    return deferred.promise; 

    connection.end(); 
} 

nodejの非同期性をどのように扱いますか?助けてください。

答えて

0

ifステートメントをthen()ステートメントの中に置くだけでよいのです。

資格情報を必要とするものはすべてthenまたはthenのthen()に入れる必要があります。 たとえば、あなたがあなたの約束返すことがあります:

return UserDAO.getAdminCredentials().then(function(rows){ ... 

をし、あなたの関数を呼び出すときに、それに続い()を追加します。

validateAdminLogin().then(...) 
0

あなたはこのようなあなたのvalidateAdminLogin機能を書き換えることができます:

function validateAdminLogin() { 
    var UserDAO = require('./js/DAO/UserDAO'); 
    var wait = require('wait.for-es6'); 
    var admin = document.getElementById("adminform").elements.namedItem("username").value; 
    var adminPwd = document.getElementById("adminform").elements.namedItem("pwd").value; 

    // return a promise which will be resolved with a bool indicating the "valid" status 
    // the promise can reject when there was an error 
    return UserDAO.getAdminCredentials().then(function(rows) { 
     var adminName = rows.username; 
     var adminPassword = rows.password; 

     if (admin !== adminName) { 
      alert("Invalid username"); 
      return false 
     } 

     if (adminPwd !== adminPassword) { 
      alert("Invalid password"); 
      return false 
     } 

     return true 
    }, function(error) { 
     console.log(error); 
    }); 
} 

boolを即座に返さないため、関数呼び出しをやや異なったものにする必要があります。あなたは、コールサイトは次のようになります:

validateAdminLogin().then(function (isValid) { 
    // handle the "isValid" bool 
}, function (error) { 
    // handle the error... 
}); 

それは、はnode.js.で非同期動作を同期させることが可能ではありません

+0

htmlの "validateAdminLogin()。then(.......)....."をどのように呼び出すのですか? –

+0

HTMLからこのように呼び出すことはできませんが、(イベント)?を処理するためのハンドラを追加することができます。私はあなたがHTMLフォームのようなものを持っていると思うので、 "[submit](https://developer.mozilla.org/en-US/docs/Web/Events/submit)を処理するためにイベントリスナーをフォームに追加することができます。 "イベント。 – Siggy

+0

それは働いていません。スクリプトは、ページが読み込まれるとすぐに実行されます。 event.preventDefault()を追加すると、すべて正常に動作しますが、preventDefault()のためにフォームは送信されません。 –

関連する問題