【问题标题】:New Promise is not working with db.transaction新承诺不适用于 db.transaction
【发布时间】: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


【解决方案1】:

截至撰写本文时,db.transaction 首先接收错误回调,您将在其中传递 resolve

这是一个例子:

// sqlite transactions don't play with promises nicely.
// the fn param here shouldn't use promises.
const transactional = async (fn: (tx: Transaction) => void) => {
  const db = await getDb();
  const x = new Promise((resolve, reject) => {
    const trans = db.transaction(fn, (e) => {
      console.log('transaction failed ')
      reject(e)
    },
    () => {
      console.log('transaction finished ok')
      resolve();
    });
  });
  await x;
};

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 2018-01-06
    • 2017-03-20
    • 2015-07-26
    • 1970-01-01
    • 2022-08-21
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多