Как я могу синхронно собирать данные обо всех браузерах Windows в Electron? - PullRequest
0 голосов
/ 19 июня 2020

У меня есть приложение, в котором я создаю несколько браузеров Windows с формами html, и я хотел бы собрать все данные (чтобы сохранить их, чтобы иметь возможность создавать их в том же состоянии в перезапуск) одним нажатием кнопки.

На данный момент единственное решение, которое я нашел для этого, - заставить каждое BrowserWindow выполнять ipcRenderer.send каждый раз, когда изменяется любая переменная (это не так сложно сделать с Vuejs 'watchers'), но это кажется требовательным и неэффективным.

Я также думал о выполнении 'execute Javascript' для каждого окна, но это не позволяет зафиксировать возвращаемое значение afaik.

Я просто хотел бы иметь возможность отправлять сообщение из main, когда делается запрос на сохранение, и ждать ответа windows, прежде чем сохранять все.

EDIT

Я нашел способ получше, он выглядит так

app. js

  // wait for update reponses
  ipc.on('update-response', (evt,args) => {
    updates[evt.sender.id] = args;
    if(Object.keys(updates).length == BrowserWindow.getAllWindows().length) {
        // here I do what I need to save my settings, using what is stored in 'updates'
        // ...
        // and now reset updates for next time
        updates = {}
    }
  });

  // now send the requests for updates
  BrowserWindow.getAllWindows().map(w => w.send('update'));

renderer. js

ipcRenderer.on('update', () => {
    // collect the data
    // var data = ...
    ipcRenderer.send('update-response', data);
})

и, очевидно, на стороне рендерера я слушаю эти сообщения 'update' и отправляю данные с помощью 'udpate-response'.

Но это кажется немного сложным, и поэтому я уверен, что есть более простой способ добиться этого с помощью фреймворка.

EDIT 2

Я понял, что это не всегда работает, потому что по какой-то причине evt.sender.id не соответствует идентификаторам, полученным из браузера Windows .getAll Windows (). Я работал над этим, отправляя идентификаторы в запрос, а ответчик включал его. Но это все так хорошо для такого маленького ...

...