Электрон - ipcRenderer не работает в асинхронном классе - PullRequest
0 голосов
/ 15 октября 2018

У меня есть класс с функциями Constructor и Async.Я сделал module.exports, чтобы я мог вызывать свой класс из моего GUI.js файла и в моем GUI.js файле, мне нужен этот класс, и все работает отлично.

Но внутри моего класса япытаюсь сделать это ipcRenderer.send('message', 'Hello');

И я получаю эту ошибку:

TypeError: Cannot read property 'send' of undefined

возможно ли удалить ipcRenderer в моем GUI.js?

Спасибо.

Мне нужен модуль в моем основном файле, и в моем файле рендерера он отправляет ipcRenderer.send('startMyClass');

И в моем главном файле: ipcMain.on('startMyClass', (event, args) => { const client = new myClass(); client.Start(); })

Это мой файл class / index.js, который требуется в моем главном файле.

const request = require('request-promise');
const cheerio = require('cheerio');
const { ipcRenderer } = require('electron')

class myClass {
  constructor() {
    this._jar = request.jar();
    this._request = request.defaults({ jar: this._jar });
  }

  async Start() {

   await this.Test();


  };

  async Test() {
    ipcRenderer.send('myMessage', 'Hello');
   }

}


module.exports = myClass;

РЕДАКТИРОВАТЬ: Если мне это не нужно, и у меня есть весь класс в моем основном файле, я могу сделатьevent.sender.send ('myMSG', 'hello');

Но я хочу сделать это в своем классе, это НЕ в том же файле, что и мой основной.

1 Ответ

0 голосов
/ 16 октября 2018

Отправка сообщения от Main к Renderer должна быть сделана путем отправки на специфичный webContents.Вот почему event.sender.send('myMSG', 'hello') работает, а ipcRenderer.send нет.Последний отправляет из Renderer в Main, как указано в документах (и, кроме того, к нему нельзя получить доступ из процесса Main, так как ваша ошибка говорит вам, что он не определен).

Как объясненов ipcMain документах вы должны получить доступ к webContents, который вы хотите отправить, и позвонить по этому номеру send.

Так, чтобы исправить свой код, вы можете

  • Передать ссылку на главное окно в myClass и вызвать send для этого

    class myClass {
      constructor(args) {
        // ...
        this.mainWindow = args.win
      }
      // ...
      async Test() {
        this.mainWindow.webContents.send('myMessage', 'Hello');
      }
    }
    
  • или send в фактически сфокусированное окно(BrowserWindow.getFocusedWindow()), если это соответствует вашим потребностям

    class myClass {
      // ...
      async Test() {
        BrowserWindow.getFocusedWindow().webContents.send('myMessage', 'Hello');
      }
    }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...