如何让javascript函数在继续之前等待WebSql事务完成
我创建了一个验证函数,以查看该值是否在数据库表中。尽管如此,该函数始终返回true,即使该值存在于表中。我还试图通过更改一个变量值来返回false,但这不会等待它,因此函数会立即返回“if”,然后返回如何让javascript函数在继续之前等待WebSql事务完成,javascript,web-sql,Javascript,Web Sql,我创建了一个验证函数,以查看该值是否在数据库表中。尽管如此,该函数始终返回true,即使该值存在于表中。我还试图通过更改一个变量值来返回false,但这不会等待它,因此函数会立即返回“if”,然后返回警报(“未使用”) 函数Rval(用户名、显示名、电子邮件){ db.事务(功能(tx){ tx.executeSql(“从用户中选择用户名,其中用户名=”+UserName.value+“”,[],函数(tx,结果){ 如果(results.rows.length>0){ 返回错误 } },空)
警报(“未使用”)
函数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),我只是想知道这样做是否可以?看起来我需要学习什么是承诺、等待和异步。首先,谢谢你,这对我很有效,但我不得不将“如果(使用(用户名、显示名、电子邮件))”改为“如果(结果)”,我只是想知道这样做是否可以?看起来我需要学习什么是承诺、等待和异步