このコードでは、変数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の非同期性をどのように扱いますか?助けてください。
htmlの "validateAdminLogin()。then(.......)....."をどのように呼び出すのですか? –
HTMLからこのように呼び出すことはできませんが、(イベント)?を処理するためのハンドラを追加することができます。私はあなたがHTMLフォームのようなものを持っていると思うので、 "[submit](https://developer.mozilla.org/en-US/docs/Web/Events/submit)を処理するためにイベントリスナーをフォームに追加することができます。 "イベント。 – Siggy
それは働いていません。スクリプトは、ページが読み込まれるとすぐに実行されます。 event.preventDefault()を追加すると、すべて正常に動作しますが、preventDefault()のためにフォームは送信されません。 –