【发布时间】:2019-11-01 14:01:53
【问题描述】:
我正在使用 React-native 中的 sqlite (react-native-sqlite-storage) 并且在我想关闭数据库时遇到了 Promise 问题:
this.dataUsuarios= await fetchData(this.url);
db = await openDB();
await this.insertarDatos();
db.close();
问题是当执行 db.close 时它给了我一个问题,因为 this.insertarDatos() 仍在处理,但不知道为什么。我认为我的新承诺应该会奏效!
insertarDatos = () =>{
return new Promise((resolve, rejection)=>{
db.transaction((tx) => {
for(let i in this.dataUsuarios){
const sql = `INSERT INTO usuarios VALUES (
${this.dataUsuarios[i].id},
'${this.dataUsuarios[i].nombre}',
'${this.dataUsuarios[i].usuario}',
'${this.dataUsuarios[i].password}',
${this.dataUsuarios[i].grupo},
'${this.dataUsuarios[i].faenas}'
);`;
tx.executeSql(sql, [], this.successCB(i), this.errorCB);
}
},resolve,rejection);
});
}
【问题讨论】:
-
transaction本身不是已经返回了一个承诺吗? -
这似乎不是promise的问题,当你使用回调样式时它是否有效?不幸的是,
transaction的文档记录确实很差 - 我没有看到任何迹象表明它正在等待处理完成。 -
Nitpick,如果您使用像
this.insertarDatos();这样的方法并且没有将其作为道具传递给子组件,最好声明像insertarDatos () { ... }这样的方法,这样它就不会复制组件的每个实例的函数。 -
只是一个猜测,但我想你需要像
return new Promise((r, j) => tx.executeSql(sql, [], () => { this.successCB(i)(); r(); }, () => { this.errorCB(); j(); }));那样一直“承诺”
标签: javascript async-await react-native-sqlite-storage