У меня есть приложение, в котором я создаю несколько браузеров 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 (). Я работал над этим, отправляя идентификаторы в запрос, а ответчик включал его. Но это все так хорошо для такого маленького ...