javascriptweb-sql

How i make my javascript function wait to WebSql transactions to finish before continuing


I made a validate function to see if the value was in the database table. The function always returns true though, even if the value exists in the table. I also tried to return false by just changing a variable value, but that doesn't wait for it so the function returns immediately to the "if" and then alert("Not in use")

function Rval(Username,Displayname,Email){

    db.transaction(function (tx) { 
        tx.executeSql("SELECT UserName FROM Users WHERE UserName='" + Username.value + "'", [], function (tx, results) { 
            if (results.rows.length > 0) {
                return false
            }
        }, null);
        tx.executeSql("SELECT Email FROM Users WHERE Email='" + Email.value + "'", [], function (tx, results) {  
            if (results.rows.length > 0) {
                return false
            }
        }, null);
        tx.executeSql("SELECT DisplayName FROM Users WHERE DisplayName='" + Displayname.value + "'", [], function (tx, results) {  
            if (results.rows.length > 0) {
                return false
            }
        }, null);
    });
}



if (Rval(Username,Displayname,Email))
{
    alert("Not in use")
}
else
{
    alert("In use")
}

Solution

  • Something like this.

    const userQ = ({field, value, tx}) => 
        new Promise((resolve) => 
            tx.executeSql(`SELECT ${field} FROM Users WHERE ${field}='${value}'`, [], (tx,results) => resolve(!results.rows.length), null))
    
    const getTx = (db) => new Promise((resolve) => db.transaction((tx) => resolve(tx)))
    
    async function inUse(userName, displayName, email) {
        const tx = await getTx(db)
        const [a,b,c] = await Promise.all([
            userQ({field:'UserName', value:userName, tx}),
            userQ({field:'DisplayName', value:displayName, tx}),
            userQ({field:'Email', value:email, tx})
        ])
        return a && b && c
    }
    
    inUse(username, displayname, email).then((result) => {
        if (result) {
            alert("Not in use")
        } else {
            alert("In use")
        }
    })