变量不会改变它's values-返回promise的函数-JavaScript



因此,每当我需要使用数据库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

这是我的控制台。日志这是我控制台的照片。log<------------------------------

所以我的问题是:

1º为什么我的变量";测试";从未将其值更改为"y"?

2º为什么我的函数返回承诺?因为我放了返回变量resultSQL?

3º为什么我的变量resultSQL也从未改变它对我的数据库结果的值?

正如你们所看到的,我与数据库的连接运行良好,返回了一个带有SQL查询结果的向量,但我无法返回这个向量,相反,我的函数正在返回一个promise。

谢谢你们的帮助,祝你们度过美好的一天!

您必须了解异步/等待是如何工作的。在背景中,他们使用承诺,所以回答了你的第二个问题。这就是为什么您的方法返回promise,因为它是一个异步方法。

回答你的另外两个问题。tx.executeSql()dbConnection.transaction()方法似乎可以使用回调,但您不需要等待回调被调用并继续执行代码。这就是为什么您认为您的变量testresultSQL没有变化。它们确实发生了变化,但在它们发生变化之前,您正在调用console.log

我建议您将sqlExecute方法从async更改为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);
});

正如我所说,您的代码可能会变成";像这样的东西";。我不能保证这个确切的代码有效,你必须稍微清理一下。

最新更新