【问题标题】:Variables not changing it's values - Function returning promise - JavaScript变量不改变它的值 - 函数返回承诺 - JavaScript
【发布时间】:2020-07-22 13:06:58
【问题描述】:

所以每次我需要使用我的数据库 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 this is a picture of my console.log

所以我的问题是:

1º 为什么我的变量“test”从未将其值更改为“y”?

2º 为什么我的函数返回一个承诺?既然我把变量resultSQL放回了?

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

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

谢谢大家帮助我,祝大家有个美好的一天!

【问题讨论】:

    标签: javascript function sqlite react-native


    【解决方案1】:

    您必须研究 async/await 的工作原理。在后台他们使用承诺,所以回答你的第二个问题。这就是为什么你的方法返回一个 Promise,因为它是一个异步方法。

    回答您的其他 2 个问题。 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);
    });

    正如我所说,您的代码可能会变成“类似这样的东西”。我不保证这个确切的代码可以工作,你必须稍微清理一下。

    【讨论】:

    • 非常感谢,效果很好,我可以看到,关于 Async/Await 和 Promises,我还有很多东西要学习!我正在使用您的代码来了解如何创建和使用我自己的承诺!我将确保更多地研究这种异步方法。再次感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2020-11-20
    • 2017-11-28
    • 2014-07-05
    • 1970-01-01
    • 2019-01-23
    • 1970-01-01
    相关资源
    最近更新 更多