Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使ipc调用的结果在函数外部可用?_Javascript_Electron - Fatal编程技术网

Javascript 如何使ipc调用的结果在函数外部可用?

Javascript 如何使ipc调用的结果在函数外部可用?,javascript,electron,Javascript,Electron,我有两个功能。一个调用ipcmain的函数,另一个是该函数的父函数。ipcmain调用从数据库获取一些数据并返回它。我们的想法是在一个服务中组织这些呼叫 我的问题是有些东西发射不正确,我不确定我的问题在哪里 如果控制台记录结果,它将正确记录,但是,来自父级的日志将首先调用并记录EventEmitter对象 我如何才能使这些命令按顺序启动,以及在该函数之外调用ipcmain Available的结果 我已经尝试过将结果赋给函数顶部的一个变量,然后在调用后返回该变量,但是,结果完全相同 我还尝试将这

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

我的问题是有些东西发射不正确,我不确定我的问题在哪里

如果控制台记录结果,它将正确记录,但是,来自父级的日志将首先调用并记录EventEmitter对象

我如何才能使这些命令按顺序启动,以及在该函数之外调用ipcmain Available的结果

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

我还尝试将这两个函数转换为async await,但没有结果

我的直觉是,“backend”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)
}
预期成果: 两个控制台日志都输出数据库名称数组

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

我认为您的问题在于您认为该方法返回什么。在函数
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);
    });
  });
}
函数将返回一个承诺,该承诺解析为您期望返回的结果。由于您使用的是
wait
关键字,因此调用此函数的方式应该保持不变

// 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);
})
// 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);
    });
  });
}