变量未更改其值-函数返回承诺-JavaScript

时间:2020-07-22 13:06:58

标签: javascript function sqlite react-native

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

谢谢你们对我的帮助,祝大家生活愉快!

1 个答案:

答案 0 :(得分:1)

您必须研究异步/等待的工作方式。他们在后台使用了承诺,因此回答了您的第二个问题。这就是为什么您的方法返回promise的原因,因为它是异步方法。

回答其他两个问题。似乎tx.executeSql()dbConnection.transaction()方法可用于回调,但是您不必等待回调被调用并恢复执行代码。这就是为什么您认为变量testresultSQL没有变化的原因。它们实际上确实在改变,但是您在它们改变之前先叫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);
});

正如我所说,您的代码可能会变成“类似这样的东西”。我不保证此确切的代码可以正常工作,您必须对其进行一些清理。