【发布时间】:2021-01-08 21:13:48
【问题描述】:
如何使tx.executeSql(SQL, [], (tx, results) 成为带有sync/await 的同步函数?
我想做一些这样的事情:
tx.executesql 是异步的,所以我的 closeDB() (closeDatabase()) 不起作用,因为事务正在进行中。
await tx.executeSql(sql, [], (tx, results)
但它不起作用。
(查看输出)
这是我在输出末尾得到的警告:
C:\...name of proyect\node_modules\react-native\Libraries\Components\ScrollView\InternalScrollViewType.js:46 Possible Unhandled Promise Rejection (id: 0):
TypeError: error is not a function
TypeError: error is not a function
at SQLitePlugin.close (blob:http://localhost:8081/7a5bb020-64e9-41f5-a654-e50e6b9f5827:93749:9)
at _callee4$ (blob:http://localhost:8081/7a5bb020-64e9-41f5-a654-e50e6b9f5827:92942:54)
at tryCatch (blob:http://localhost:8081/7a5bb020-64e9-41f5-a654-e50e6b9f5827:23006:19)
.
.
.
.
async componentDidMount() {
console.log('*COMIENZA componentDidMount');
await this.consultarBD();
await this.openBD();
console.log('DataUsuarios es: ' + this.state.dataUsuarios);
await this.insertarDatos();
await this.closeDatabase();
console.log('*TERMINA componentDidMount');
}
insertarDatos = async () =>{
console.log('COMIENZA insertarDatos');
await db.transaction((tx) => {
console.log('Comienza Transaction');
for(let i in this.state.dataUsuarios){
const sql = `INSERT INTO usuarios VALUES (
'${this.state.dataUsuarios[i].id}',
'${this.state.dataUsuarios[i].nombre}',
'${this.state.dataUsuarios[i].usuario}',
'${this.state.dataUsuarios[i].password}',
'${this.state.dataUsuarios[i].grupo}',
'${this.state.dataUsuarios[i].faenas}'
)`;
console.log('antes de excute i es: ' + i);
tx.executeSql(sql, [], (tx, results) => {
console.log('dentro de executesql i es: ' + i);
if(results.rowsAffected > 0){
console.log('¡Datos insertados en BD!');
}else{
console.log('¡No se puedieron insertar datos en la BD!');
}(error) => {
console.log(error.message);
}
});
}
console.log('termina transaccion');
});
console.log('TERMINA insertarDatos');
}
输出:
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:22 COMIENZA insertarDatos
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 Comienza Transaction
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 0
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 1
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 2
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:88 antes de excute i es: 3
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:90 termina transaccion
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:112 TERMINA insertarDatos
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:128 Cerrando database ...
C:\Users\josen\React-Projects\Ges\src\Screen\DrawerScreens\index.js:7 cannot close: transaction is in progress
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 0
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD!
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 1
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD!
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 2
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD!
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:91 dentro de executesql i es: 3
C:\Users\josen\React-Projects\Ges\src\Screen\Login.js:93 ¡Datos insertados en BD!
【问题讨论】:
标签: javascript reactjs asynchronous async-await