2017-05-12 68 views
0

我正在制作与本地数据库密切协作的React和Electron应用程序。我有2个表格,“阻止”和“畅通无阻”,这个应用程序的目标是只需点击一个按钮就可以将一行数据从一个表格移动到另一个表格。大多数事情似乎工作正常,但我遇到更新我的表异常与REDX数据。这里是我必须得到数据的功能:如何在返回响应之前等待数据库完成查询?

var fetchDBData = (tablename) => { 
    var db = new sqlite3.Database('processlist.db'); 
    var queries = []; 
    db.each("SELECT * FROM " + tablename, function(err, row) { 
    queries.push(row); 
    }); 

    db.close(); 
    return queries; 
}; 

而且我有2个动作是更新终极版:

export function updateBlockedFiles(blacklist_queries) { 
    console.log(blacklist_queries); 
    return { 
    type: UPDATE_BLOCKED_FILES, 
    payload: blacklist_queries 
    } 
}; 

export function updateWhitelistedFiles(whitelist_queries) { 
    console.log(whitelist_queries); 
    return { 
     type: UPDATE_WHITELISTED_FILES, 
     payload: whitelist_queries 
    } 
}; 

而我在我的组件调用看起来是这样的:

unblockProcess(id) { 
    window.transferRowFromTable('blacklistdb', 'whitelistdb', id); 
    var blacklist_queries = window.fetchDBData('blacklistdb'); 
    var whitelist_queries = window.fetchDBData('whitelistdb'); 
    this.props.updateBlockedFiles(blacklist_queries); 
    this.props.updateWhitelistedFiles(whitelist_queries); 
}; 

我发现的问题主要发生在fetchDBData()中。当我调用this.props.updateBlockedFiles()时,它返回一个空的查询数组而不是一个填充的数组。我想这可能是一个异步问题,但我不知道如何解决它。我见过使用promise的想法,但我不知道如何将它与React集成。任何帮助将有所帮助!

+0

你在哪里实际执行查询?我认为你需要一个'db.run()'调用或类似的东西 - 不知道我头顶上的确切语法。 –

+0

在db.each()查询中,我将每行附加到查询var,它的工作原理是因为我在启动时调用了该函数,并且表正确填充,只有当我更新并再次调用时才返回一个空数组。 –

回答

0

我正在做类似的事情......让我画这个概念,看看它是否有意义。

在将IPC请求发送到主进程以运行SQL之前,请在您的渲染器进程中创建一个IPC侦听器,以便在SQL查询完成时充当回调。这个回调可以被构造来处理来自SQLite查询的数据输出。下面粗略例如:

渲染过程:

var ipcRenderer = require('electron').ipcRenderer  

function handleDBResponse(event, data){ 
    // Do something with the data 
} 

ipcRenderer.on('dbResponse', handleDBResponse) 

ipcRenderer.send('dbQuery', "some_table_name") 

主要过程:

var ipcMain = require('electron').ipcMain 

function doDBQuery(event, tablename){ 
    // Perform your DB query via SQLite 

    var db = new sqlite3.Database('processlist.db'); 
    var queries = []; 
    db.each("SELECT * FROM " + tablename, function(err, row) { 
     queries.push(row); 
    }); 

    db.close(); 
    // Send queries back to callback handler 
    event.sender.send('dbResponse', queries) 
} 

ipcMain.on('dbQuery', doDBQuery) 

这都是经由电子的IPC方法完成的主要和渲染过程之间进行通信。更多细节可以在这里进行研究:https://github.com/electron/electron/blob/master/docs/api/ipc-main.md

+0

感谢您的解释,但是,我没有使用任何ipcMain或ipcRenderer方法。我将这些javascript函数编码在一个文件中,并作为脚本包含在我的index.html中,并在我的React组件中运行它们。 –

+0

同样的原则将适用于 - 在你的db.close()调用一个回调函数而不是'event.sender.send'(即上面例子中的'handleDbBesponse()')之后,将数据推送到Redux或任何地方你需要它。 – Sators

+0

为了让你的'fetchDBData()'函数保持纯净,向函数添加一个'callback'参数并在'return'之前调用该回调函数... – Sators

相关问题