Взятие данных в Основном процессе в Электроне
Здравствуйте! Пишу программу на Электроне. В процессе работы пользователя программа сохраняет данные в массиве. Мне эти данные нужно получить в Основном процессе. Проблема в том, что программа всегда возвращает данные, которые изначально были в массиве при старте программы полностью игнорируя все изменения. Они как будто кешируются. Хотя на старте программы эти данные не запрашиваются.
Я пошел другим путем и написал функцию возвращающую массив данных. В этом случае кеша точно не может быть. Но снова возвращается изначальный массив. Почему программа так странно себя ведет? Как в Основном процессе получить массив с текущими данными? |
Эм... 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, время: 07:04. |