90757


初めて質問させていただきます。

現在、Electronを学習中です。  
JavaScriptについても非同期通信周りは特に理解が浅く、様々な箇所で理解が不足していることをご了承ください。

表題の通り、プリロードに記載した処理をレンダラープロセス側で実行すると、  
その処理結果がPromiseオブジェクトで返されます。  
Promiseオブジェクトではなく、処理結果（PromiseResult）をそのまま受け取りたいのですが上手くいきません。

▼プリロード（preload.js）

[code]

    const { contextBridge, ipcRenderer } = require('electron');
    
    contextBridge.exposeInMainWorld('mysqlAPI', {
        dbConnect: async () => await ipcRenderer.invoke('dbconnect'),
        dbDisconnect: async () => await ipcRenderer.invoke('dbdisconnect'),
        queryExecute: async (query, params) => await ipcRenderer.invoke('queryExecute', query, params),
    });
    
[/code]

目指す処理としては、メインプロセス側でmysql2パッケージを利用してMySQLサーバーにSELECTクエリを発行し  
取得結果をレンダラープロセス側に返すことを目的としています。

まず、現時点で確認できていることは

  * クエリ発行処理(queryExecute)は動作確認済み。目的のデータが取得できている
  * レンダラープロセス側でwindow.mysqlAPI.queryExecute()を実行するとPromiseが返される 
    * PromiseResultには取得結果が格納されているのをDeveloper Toolsで確認済

preload.jsのqueryExecute部のコードを以下のように変更すると  
` queryExecute: async (query, params) => {const res = await
ipcRenderer.invoke('queryExecute', query, params); console.log(res); return
res;},`  
console.log(res)で出力されるのはPromiseオブジェクトではなく、取得結果であることを確認しました。

上記のことから、preload.jsを経由することでPromiseオブジェクトに格納されてレンダラープロセスに渡される、という認識でいますが、間違いないでしょうか。

preload.jsが怪しいとは思いますが、ここから先どうすればレンダラープロセス側にPromiseではなく  
結果を直接返せるようになるかが分かりません。  
どうかお力添えをいただけないでしょうか。  
また、情報が不足している箇所などありましたらお申し付けください。


CC BY-SA 4.0
2022-08-25T07:04:59.810
90752
2022-08-25T12:32:36.087
54145
question
javascript electron
プリロードで定義したAPIの結果がPromiseオブジェクトで返ってくる


Electron は触ったこともないのですが、プロセス間通信が非同期で`Promise`が返ってくるのはごく自然で回避不可能な仕様に見えます。

レンダラープロセス側で `await` するのが最も簡単な対処じゃないでしょうか。


CC BY-SA 4.0
2022-08-25T08:10:19.177
90753
2022-08-25T08:10:19.177
3475
90752
answer


未確認ですが以下の様にしてはどうでしょうか？

[code]

    queryExecute: async (query, params) => await ipcRenderer.invoke('queryExecute', query, params),
    
      ↓
    
    queryExecute: (query, params) => ipcRenderer.invoke('queryExecute', query, params),
    
[/code]

上記の様に変更して、呼び出し側で

[code]

    const res = await window.mysqlAPI.queryExecute(a, b);
    
[/code]

の様に呼び出せば行けそうな気がします。


CC BY-SA 4.0
2022-08-25T12:32:36.087
90757
2022-08-25T12:32:36.087
54118
90752
answer