繁体   English   中英

电子等待 sqlite3 响应

[英]Electron await sqlite3 response

我的main.js中有一个 sqlite3 数据库请求,这是由renderer.js中的按钮单击触发的。

请求到达我的main.js 但是,我无法等待数据库的结果。 该问题已经出现在main.js中,所以我什至在将任何内容传递回renderer.js之前就被卡住了。

我希望有人能告诉我我错过了什么。

这是我的代码:

renderer.js

$(document).on('click','#mybtn',function(e){

    let query = "SELECT id, name FROM table1"

    // send (here is the issue)
    window.api.send("db-query", query)

    // (next step: receive, might be wrong but not yet my problem)
    window.api.receive(channel="receive-db-data", (data) => {
      console.log(data);
    });

});

main.js


ipcMain.on(channel='db-query', async (e, query) => {
  console.log('query received: ' + query);
  
  let data = await db_request(query).then(
      function(value) {
         console.log('value: ' + value);
         return value;
      },
      function(error) {
         console.log('error fetching data from db on query:' + query);
      }
  )
  console.log("response ready: " + data); //returns undefined if 'return value' is used (otherwise nothing)

  // to send back to renderer.js later
  e.sender.send("db-data", data)

})


let db_request = async (query) => {

  let data = []

  var sqlite3 = require('sqlite3').verbose();
  var dbPath = require('path').resolve(__dirname, '../../Fin.db')
  var db = new sqlite3.Database(dbPath)

  db.serialize(function(){
    db.each(query, function(err, row) {
      console.log(row)
      data.push({"id": row.id, "name": row.name})
    });
  });
  db.close();

  console.log('db_request:' + data)

  return data
}

这就是我的终端的样子:

query received: SELECT id, type, name FROM table1
db_request:
value: 
response ready: undefined
{ id: 1, name: 'a' }
{ id: 2, name: 'b' }
{ id: 3, name: 'c' }

您必须将db_request结果转换为 Promise,当所有行都推送到data时,promise 将被解析。 当您使用await关键字时,无需使用.then链处理承诺。

main.js看起来像这样:

const sqlite3 = require('sqlite3').verbose();
const dbPath = require('path').resolve(__dirname, '../../Fin.db')

ipcMain.on(channel='db-query', async (e, query) => {
  console.log('query received: ' + query)

  try {
    const data = await db_request(query); // remove .then
    console.log('value: ' + data)
    // to send back to renderer.js later
    e.sender.send("db-data", data)
  } catch (error) {
    console.log('error fetching data from db on query:' + query);
    e.sender.send("db-data", []) // send empty data or error ???
  }
})


let db_request = (query) => {
  const db = new sqlite3.Database(dbPath)

  return new Promise((resolve, reject) => { // return a promise
    // I think you dont need serialize for this case
    const data = []
    db.each(query, (err, row) => {
      console.log(err, row)
      if (!err) {
        data.push({"id": row.id, "name": row.name})
      }
    }, (error) => {
      if (error) {
        reject(error)
      } else {
        resolve(data)
      }
    });
  })
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM