如何通过函数外部的ipc调用提供结果?

时间:2019-04-24 21:34:07

标签: javascript electron

我有两个职能。一个调用ipcmain,另一个调用该函数。 ipcmain调用从数据库中获取一些数据并将其返回。想法是将这些呼叫组织在服务中。

我的问题是无法正确触发,我不确定我的问题在哪里。

如果我通过控制台记录结果,则它会正确记录日志,但是,来自父目录的日志会先调用并记录EventEmitter对象。

如何在功能外调用这些命令,并从ipcmain调用结果呢?

我已经尝试过将结果分配给函数顶部的变量,然后在调用后返回该变量,但是结果完全相同。

我还尝试了将两个函数都转换为异步等待,但没有结果。

我的直觉是,“后端” ipcmain.on()函数未发送承诺,因此在设置该值之前会发生父日志。

// Parent Function
async getDbs (event){
  var databaseName = event.target.parentNode.innerText;
  this.selectedServer = this.LocalStorage.getItem(databaseName);
  this.databaseArray = await this.BackendService.getDbs(this.selectedServer)
  console.log(await this.databaseArray)
}
// Call to IPC Main
getDbs(config) {
  window.ipc.send('auth-getdbs', config);
  return window.ipc.on('auth-getdbs-reply', async (event, result) => {
    // Correctly logs an array of databases
    console.log(result);
    // returns the EventEmitter object
    return result;
  });
}
// IPC Main Function
ipcMain.on('auth-getdbs', async (event, arg) => {
  var results = await handlers.getDbs(event, arg, scope);
  event.sender.send('auth-getdbs-reply', results);
})

预期结果: 两个控制台日志都输出数据库名称数组

实际结果: 父功能控制台记录EventEmitter,ipcmain调用的控制台日志记录数据库数组。

1 个答案:

答案 0 :(得分:0)

我认为您遇到的问题是您认为该方法返回的结果。在您的函数getDbs中,我确实不确定方法window.ipc.on返回的是回调函数返回的值;它会返回该方法创建的EventEmitter。

由于您似乎正在使用异步回调,因此我将执行以下操作。

// Call to IPC Main
getDbs(config) {
  window.ipc.send('auth-getdbs', config);
  return new Promise((resolve, reject) => {
    window.ipc.on('auth-getdbs-reply', (event, result) => {
      resolve(result);
    });
  });
}

该函数将返回一个Promise,该Promise可解决您期望返回的结果。由于您使用的是await关键字,因此调用此函数的方式应保持不变。