Взятие данных в Основном процессе в Электроне
Здравствуйте! Пишу программу на Электроне. В процессе работы пользователя программа сохраняет данные в массиве. Мне эти данные нужно получить в Основном процессе. Проблема в том, что программа всегда возвращает данные, которые изначально были в массиве при старте программы полностью игнорируя все изменения. Они как будто кешируются. Хотя на старте программы эти данные не запрашиваются.
Я пошел другим путем и написал функцию возвращающую массив данных. В этом случае кеша точно не может быть. Но снова возвращается изначальный массив. Почему программа так странно себя ведет? Как в Основном процессе получить массив с текущими данными? |
Эм... 42
|
Цитата:
|
|
А чем вам ответ "42" не устроил? Хорошо, давай-те попробуем разжевать.
У меня есть холодильник, ложу в него масло, через некоторое время открываю а масла в нём нет! Пошел другим путем и масло теперь, сначала в корзинку ложу и снова в холодильник. И снова фиаско! Масло опять исчезает =/ Может ли мне кто ни будь подсказать, почему так странно ведет себя холодильник? Ну и по факту, что вы там делаете, как запускаете, что за код у вас там, лицом ли вы сидите к монитору? До этого вероятные помощники догадываться должны? Конкретике больше а то от заголовка веет не задачей а размышлением. Чем больше деталей тем явнее ответ. И на ваш вопрос ответом "42" был не спроста! Думал смекнете. А нет, сочли спамом дельную мысль. |
Тут нет никакого особенного кода. Поэтому и не писал. Обычное подключение файла, в котором экспортируется массив.
Есть файл с массивом. В процессе работы программы массив наполняется данными. В файле Основного процесса (main.js) массив через require() подключается в функции. Функция вызывается через некоторое время после запуска программы. К этому времени в массиве уже 100% есть данные. Затем функция выводит данные в консоле. Все абсолютно примитивно: main.js
// Старт программы
app.on( 'ready', function(){
... код создание окна и другие действия не относящиеся к подключению файла...
// Импортировать массив с данными через 3 секунды и показать содержимое
setTimeout(function () {
let sceneElems = require('../renderProcess/editorJS/sceneElems').sceneElems;
console.log(sceneElems);
}, 3000);
} );
Но этот код выводит содержимое массива, которое было при старте программы. Если был пустой массив, то пустой, если другие данные, то это данные. А до вызова функции возвращающей содержимое массива в нем данные меняются. И такое происходит только в Основном процессе. В процессе Отображения этот код срабатывает как нужно. |
Спасибо за ответ! Попробую в начале сохранить данные массива как файл и затем прочесть из Основного процесса.
Цитата:
|
Мммммм, не надо придумывать велосипедов, если уж пользуетесь Electron, то лучше начать с чтения документации:
https://electronjs.org/docs/api/ipc-renderer |
1. Раскуриваем анонимность в JS
2. Вновь импортированный модуль это вновь выделенная память и с предыдущим импортом общего ни чего не имеет.
// Старт программы
let model = [] // your import array(yes, in begin programm)
// let sceneElems = require('../renderProcess/editorJS/sceneElems').sceneElems;
app.on( 'ready', function(){
// код создание окна и другие действия не относящиеся к подключению файла...
// use array
setTimeout(function () {
// array operations
model.push('arguments')
console.log(model);
}, 3000);
});
Так же хотелось бы посмотреть файл в котором экспортируется массив. |
Спасибо EmperioAf за наводку на правильный путь! Документацию читал, то даже в голову не пришло что так можно было.
Напишу как понял почему программа так себя вела. Файлы Основного процесса и процесса Отображения находятся как бы каждый в своей песочнице. Если просто обратиться к файлу из другого процесса, то он возвратит данные, которые находятся в файле. А при работе сценария новые данные записываются не в файл, а в оперативную память. Для передачи данных между двумя процессами есть модуль IPC. В моем случае нужно из Основного процесса передать сообщение на запрос данных. В процессе Представления запрос будет услышан и отправлено сообщение с массивом данных. И в конце в Основном процессе будет получено сообщение с массивом из процесса Отображения. Код: main.js
// Отправить запрос в процесс Представления на получение массива элементов сцены
mainWindow.webContents.send('get-scene-arr');
// Получить ответ...
ipcMain.on('dispatch-scene-arr', (e, sceneElems) => {
// Вывести данные в консоле
console.log( sceneElems );
});
render.js
// Получить запрос из Основного процесса на получение массива с элементами сцены
ipcRenderer.on('get-scene-arr', function (e, args) {
// Отправить сообщение в Основной процесс с массивом элементов сцены
ipcRenderer.sendSync('dispatch-scene-arr', sceneElems);
});
|
| Часовой пояс GMT +3, время: 20:22. |