NodeJs / Electron: Как дождаться завершения функции, прежде чем ipcMain отправит ответ? - PullRequest
0 голосов
/ 24 августа 2018

Я изучаю 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 и await, но я не знаю, насколько это возможно, я могу разместить их здесь.Потому что 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
 })
}

Возвращает «ожидание зарезервированное слово»

Заранее спасибо!

Ответы [ 3 ]

0 голосов
/ 24 августа 2018

Кажется, что ваша 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)
0 голосов
/ 24 августа 2018

Вы упустили две важные вещи для выполнения обратного вызова, ожидающего другую функцию:

  1. Ваша функция (ожидаемая) должна вернуть объект Promise для возможности be await ed
  2. Ваш обратный вызов должен быть async функцией для возможности await
const {ipcMain} = require('electron')

function treatData (input) {
  return new Promise((resolve, reject) => {
    var treated = treat(input)
    // ...
    resolve(treated)
  })
}
ipcMain.on('asynchronous-message', async (event, rawdata) => {
  var dataTreated = await treatData(rawdata)
  event.sender.send('asynchronous-reply', dataTreated)
})
0 голосов
/ 24 августа 2018

В вашем коде может отсутствовать ключевое слово 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
   })
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...