NodeJs / Electron:如何在ipcMain返回其答案之前等待功能完成?

时间:2018-08-24 11:44:52

标签: node.js electron

我正在学习nodejs和电子,我试图从渲染器接收数据,处理这些数据,然后将它们发送回去。但是我的处理功能太慢,或者我真的不知道,所以ipc太早发送回数据并生成未定义的数据。 简而言之,我希望我的处理功能在ipcMain事件发送回消息之前完成。 这只是我被困住的一个例子,虽然它不是我的真实代码,我可以将真实的代码发送给您,但是它确实很混乱,就像很多一样。

// In main process.
const {ipcMain} = require('electron')

function treatData (input) {
var treated = treat(input)
    // ...
console.log(treated) // prints the actual treated data
return treated;
}

ipcMain.on('asynchronous-message', (event, rawdata) => {
  console.log(rawdata) // prints my raw data
  var dataTreated = treatData(rawdata)
  console.log(dataTreated) // prints Undefined
  event.sender.send('asynchronous-reply', dataTreated) // send Undefined data
})

在我每天学习新事物时,我经常会坚持一些基本的知识,但是我和我需要您的帮助。我已经在寻找像我这样的问题,但是我什么也找不到,因为我不知道问题的实质。 我用async搜索了异步函数,然后等待,但是我不知道如何将它们放在这里。因为异步似乎不适用于ipcMain,或者我不知道我缺少什么,但这不起作用:

async function RenderMessage () {
ipcMain.on('asynchronous-message', (event, rawdata) => {
  console.log(rawdata) // prints my raw data
  var dataTreated = await treatData(rawdata)
  console.log(dataTreated) // prints Undefined
  event.sender.send('asynchronous-reply', dataTreated) // send Undefined data
 })
}

返回“ await是保留字”

谢谢!

3 个答案:

答案 0 :(得分:1)

您的代码可能缺少async关键字。所以应该是

function sendMessage () {
  ipcMain.on('asynchronous-message', async (event, rawdata) => {
    console.log(rawdata) // prints my raw data
    var dataTreated = await treatData(rawdata)
    console.log(dataTreated) // prints Undefined
    event.sender.send('asynchronous-reply', dataTreated) // send Undefined data
   })
}

答案 1 :(得分:0)

您的 treatData()函数似乎具有异步行为。 进行以下更改:

// In main process.
const {ipcMain} = require('electron')

async function treatData (input) {
  try{
    var treated = treat(input)
    // ...
    console.log(treated) // prints the actual treated data
    return treated;
  }
  catch(err){
    // handle error
  }

}

ipcMain.on('asynchronous-message', async (event, rawdata) => {
  console.log(rawdata) // prints my raw data
  var dataTreated = await treatData(rawdata)
  console.log(dataTreated) // will print the actual data
  event.sender.send('asynchronous-reply', dataTreated)
})

如果您的 treat()函数包含一些异步代码,请使其异步并使用

var treated = await treat(input)

答案 2 :(得分:0)

您错过了两个重要的事项,无法实现等待另一个功能的回调:

  1. 您的函数(要等待)应该返回一个physical_limits = MultiSelectField('Physical Limitations', choices=PHYSICAL_LIMIT, max_length=255) 对象,以便能够be awaited
  2. 您的回调函数应为Promise的{​​{1}}函数
async