因此,每次需要使用数据库SQLite时,我都会创建一个函数,为此函数赋予3个参数,然后它会为我返回结果。
问题在于该函数正在返回promise,并且我也尝试更新某些变量的值,并且它们没有改变:
让我向您展示我的代码,然后为您更好地说明我遇到的问题:
//Down here I'm using the function I made, I'm passing as parameters my
// connection, my SQL string, and my arguments
(Main.js)
const resultSQL = sqlExecute(db,'SELECT * FROM tbl_diarys',[]);
console.log(resultSQL)
----- // Now this down here is the function I made------------------------------------------------------
const { Alert } = require("react-native")
const sqlExecute = async (dbConection,sqlQuery,arg,)=> {
let resultSQL = []
let test = 'x' // variable that i created to make a test changing it's value
await dbConection.transaction((tx)=>{
tx.executeSql(sqlQuery,arg,(tx,results)=>
{
Alert.alert('', 'SQL executed with success')
var len = results.rows.length;
var vectorResults = []
for (let i=0; i<len; i++){
let row = results.rows.item(i);
vectorResults.push(row)
}
console.log(vectorResults) // Showing the results from my database
test = 'y' // trying to change the value of variable "test" from 'x' to 'y'
resultSQL = [...vectorResults]; // cloning my results from database to my variable resultSQL
},(error)=>{Alert.alert('Some error had happened'); console.log(error)})
})
console.log(test) // showing the value of my variable "test"
console.log(resultSQL) // showing the value of my variable resultSQL
return (resultSQL);
}
module.exports=sqlExecute
这是我的控制台。 this is a picture of my console.log <----------------------------------
所以我的问题是:
1º为什么我的变量“ test”从未将其值更改为“ y”?
2º为什么我的职能正在返回承诺?因为我放了返回变量resultSQL?
3º为什么我的变量resultSQL
也从未更改过它对数据库结果的值?
你们看到我与数据库的连接运行良好,返回带有SQL查询结果的向量,但是我无法返回这个向量,而是我的函数返回了一个Promise。
谢谢你们对我的帮助,祝大家生活愉快!
答案 0 :(得分:1)
您必须研究异步/等待的工作方式。他们在后台使用了承诺,因此回答了您的第二个问题。这就是为什么您的方法返回promise的原因,因为它是异步方法。
回答其他两个问题。似乎tx.executeSql()
和dbConnection.transaction()
方法可用于回调,但是您不必等待回调被调用并恢复执行代码。这就是为什么您认为变量test
和resultSQL
没有变化的原因。它们实际上确实在改变,但是您在它们改变之前先叫console.log
。
我建议您将sqlExecute
方法从异步更改为Promise(我认为对于初学者来说更容易理解)。会变成这样:
const sqlExecute = (dbConection,sqlQuery,arg,)=> {
return new Promise((resolve, reject)=>{
let resultSQL = []
let test = 'x' // variable that i created to make a test changing it's value
dbConection.transaction((tx)=>{
tx.executeSql(sqlQuery,arg,(tx,results)=>
{
Alert.alert('', 'SQL executed with success');
var len = results.rows.length;
var vectorResults = []
for (let i=0; i<len; i++){
let row = results.rows.item(i);
vectorResults.push(row)
}
console.log(vectorResults) // Showing the results from my database
test = 'y' // trying to change the value of variable "test" from 'x' to 'y'
resultSQL = [...vectorResults]; // cloning my results from database to my variable resultSQL
console.log(test) // showing the value of my variable "test"
console.log(resultSQL) // showing the value of my variable resultSQL
resolve(resultSQL);
},(error)=>{
reject(error);
});
});
});
}
// Call sqlExecute as a promise, for example
sqlExecute(connection, query, arg).then(()=>{
console.log('We did it!');
}).catch((error)=>{
Alert.alert('Some error had happened');
console.log(error);
});
正如我所说,您的代码可能会变成“类似这样的东西”。我不保证此确切的代码可以正常工作,您必须对其进行一些清理。