簡體   English   中英

如何在返回響應之前等待數據庫完成查詢?

[英]How to wait for database to finish querying before returning a response?

我正在制作一個與本地數據庫緊密配合的React和Electron應用程序。 我有2個表,“已阻止”和“未阻止”,此應用程序的目標是通過單擊按鈕將一行中的數據從一個表移動到另一個表。 大多數事情似乎都工作正常,但是我無法使用redux數據異步更新我的表。 這是我必須獲取數據的功能:

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個動作來更新redux:

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()時,它返回的是一個空查詢數組,而不是填充的查詢數組。 我認為這可能是一個異步問題,但是我不確定如何解決。 我已經看到了使用諾言的想法,但是我不知道如何將其與React集成。 任何幫助都會有所幫助!

我正在做類似的事情...讓我描繪一下這個概念,看看它是否有意義。

在將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)

所有這些都是通過Electron的IPC方法在主進程與渲染進程之間進行通信來完成的。 可以在這里研究更多詳細信息: https : //github.com/electron/electron/blob/master/docs/api/ipc-main.md

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM