如何让javascript函数在继续之前等待WebSql事务完成

如何让javascript函数在继续之前等待WebSql事务完成,javascript,web-sql,Javascript,Web Sql,我创建了一个验证函数,以查看该值是否在数据库表中。尽管如此,该函数始终返回true,即使该值存在于表中。我还试图通过更改一个变量值来返回false,但这不会等待它,因此函数会立即返回“if”,然后返回警报(“未使用”) 函数Rval(用户名、显示名、电子邮件){ db.事务(功能(tx){ tx.executeSql(“从用户中选择用户名,其中用户名=”+UserName.value+“”,[],函数(tx,结果){ 如果(results.rows.length>0){ 返回错误 } },空)

我创建了一个验证函数,以查看该值是否在数据库表中。尽管如此,该函数始终返回true,即使该值存在于表中。我还试图通过更改一个变量值来返回false,但这不会等待它,因此函数会立即返回“if”,然后返回
警报(“未使用”)

函数Rval(用户名、显示名、电子邮件){
db.事务(功能(tx){
tx.executeSql(“从用户中选择用户名,其中用户名=”+UserName.value+“”,[],函数(tx,结果){
如果(results.rows.length>0){
返回错误
}
},空);
tx.executeSql(“选择来自用户的电子邮件,其中电子邮件='”+Email.value+“'”,[],函数(tx,结果){
如果(results.rows.length>0){
返回错误
}
},空);
tx.executeSql(“从用户中选择DisplayName,其中DisplayName=”+DisplayName.value+”,[],函数(tx,结果){
如果(results.rows.length>0){
返回错误
}
},空);
});
}
if(Rval(用户名、显示名、电子邮件))
{
警报(“未使用”)
}
其他的
{
警报(“正在使用”)
}

您可以说您的函数将返回一个承诺

return new Promise((resolve, reject) => {
tx.executeSql("SELECT UserName FROM Users WHERE UserName=?", Username.value, (tx, results) => {
  if(results.rows.length > 0 {
  return resolve(false)
  //or return reject(new Error(error)) for errors
 }
}

您可以说您的函数将返回一个承诺

return new Promise((resolve, reject) => {
tx.executeSql("SELECT UserName FROM Users WHERE UserName=?", Username.value, (tx, results) => {
  if(results.rows.length > 0 {
  return resolve(false)
  //or return reject(new Error(error)) for errors
 }
}
像这样的

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")
    }
})
像这样的

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")
    }
})

db.transaction
是否使用承诺或回调来表示它已完成?另外,永远不要使用
alert
:立即更改代码,将任何
alert
替换为
console.log
,并养成查看开发工具控制台的习惯。你越早停止使用alert,你就越早不会阻塞JS线程,也不会阻塞你正在查看的页面试图做的任何事情。这是一个传统的函数,不适合在现代JS中使用,没有一个明智的现代教程会教你如何使用它。
db.transaction
是否使用承诺或回调来表示它完成了?另外,永远不要使用
alert
:立即更改代码,将任何
alert
替换为
console.log
,并养成查看开发工具控制台的习惯。你越早停止使用alert,你就越早不会阻塞JS线程,也不会阻塞你正在查看的页面试图做的任何事情。这是一个传统的功能,不适合在现代JS中使用,没有一个明智的现代教程会教你如何使用它。首先,谢谢你,它对我很有用,但我不得不将“if(inUse(username,displayname,email))”改为“if(result),我只是想知道这样做是否可以?看起来我需要学习什么是承诺、等待和异步。首先,谢谢你,这对我很有效,但我不得不将“如果(使用(用户名、显示名、电子邮件))”改为“如果(结果)”,我只是想知道这样做是否可以?看起来我需要学习什么是承诺、等待和异步