Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 新承诺不适用于db.transaction_Javascript_Async Await_React Native Sqlite Storage - Fatal编程技术网

Javascript 新承诺不适用于db.transaction

Javascript 新承诺不适用于db.transaction,javascript,async-await,react-native-sqlite-storage,Javascript,Async Await,React Native Sqlite Storage,我正在使用react-native中的sqlite(react-native sqlite存储),我在关闭数据库时遇到了一个问题: this.dataUsuarios= await fetchData(this.url); db = await openDB(); await this.insertarDatos(); db.close(); 问题是,当执行db.close时,它给了我一个问题,因为这个.insertarDatos()仍在处理,但idk

我正在使用react-native中的sqlite(react-native sqlite存储),我在关闭数据库时遇到了一个问题:

    this.dataUsuarios= await fetchData(this.url);    
    db = await openDB();
    await this.insertarDatos();
    db.close();

问题是,当执行db.close时,它给了我一个问题,因为这个.insertarDatos()仍在处理,但idk为什么。我想我的新承诺应该行得通

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);
    });
  }

在编写本
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;
};


在编写本
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;
};


transaction
本身是否已返回承诺?这似乎不是承诺的问题,在使用回调样式时是否有效?不幸的是,
transaction
的文档记录非常糟糕-我看不到任何迹象表明它在等待处理完成。如果您使用的是类似于
this.insertarDatos()的方法,请吹毛求疵并且不将其作为道具传递给子组件,最好像
insertarDatos(){…}
这样声明方法,这样它就不会为组件的每个实例制作函数的副本。只是一个猜测,但我想您需要像
返回新承诺((r,j)=>tx.executeSql那样一路“promisify”(sql,[],()=>{this.successCB(i)(;r();},()=>{this.errorCB();j();}))
事务本身没有返回承诺吗?这似乎不是承诺的问题,当您使用回调样式时它是否工作?不幸的是
事务
的文档记录非常糟糕-我看不到任何迹象表明它等待处理完成。如果您使用类似的方法,请吹毛求疵
this.insertarDatos();
并且不要将它作为道具传递给子组件,最好像
insertarDatos(){…}
这样声明方法,这样它就不会为组件的每个实例制作函数的副本。只是一个猜测,但我可以想象您需要像
返回新承诺一样一直“promisify”((r,j)=>tx.executeSql(sql,[],()=>{this.successCB(i)(;r();},()=>{this.errorCB();j();}));