Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 21.06.2018, 07:49
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Взятие данных в Основном процессе в Электроне
Здравствуйте! Пишу программу на Электроне. В процессе работы пользователя программа сохраняет данные в массиве. Мне эти данные нужно получить в Основном процессе. Проблема в том, что программа всегда возвращает данные, которые изначально были в массиве при старте программы полностью игнорируя все изменения. Они как будто кешируются. Хотя на старте программы эти данные не запрашиваются.

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

Почему программа так странно себя ведет? Как в Основном процессе получить массив с текущими данными?
Ответить с цитированием
  #2 (permalink)  
Старый 21.06.2018, 11:35
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

Эм... 42
Ответить с цитированием
  #3 (permalink)  
Старый 21.06.2018, 11:40
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Сообщение от stweet Посмотреть сообщение
Эм... 42
Что это за магическое число?
Ответить с цитированием
  #4 (permalink)  
Старый 21.06.2018, 12:00
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

42
Ответить с цитированием
  #5 (permalink)  
Старый 21.06.2018, 15:30
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

А чем вам ответ "42" не устроил? Хорошо, давай-те попробуем разжевать.

У меня есть холодильник, ложу в него масло, через некоторое время открываю а масла в нём нет! Пошел другим путем и масло теперь, сначала в корзинку ложу и снова в холодильник. И снова фиаско! Масло опять исчезает =/
Может ли мне кто ни будь подсказать, почему так странно ведет себя холодильник?

Ну и по факту, что вы там делаете, как запускаете, что за код у вас там, лицом ли вы сидите к монитору? До этого вероятные помощники догадываться должны? Конкретике больше а то от заголовка веет не задачей а размышлением. Чем больше деталей тем явнее ответ. И на ваш вопрос ответом "42" был не спроста! Думал смекнете. А нет, сочли спамом дельную мысль.
Ответить с цитированием
  #6 (permalink)  
Старый 21.06.2018, 16:17
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Тут нет никакого особенного кода. Поэтому и не писал. Обычное подключение файла, в котором экспортируется массив.

Есть файл с массивом. В процессе работы программы массив наполняется данными. В файле Основного процесса (main.js) массив через require() подключается в функции. Функция вызывается через некоторое время после запуска программы. К этому времени в массиве уже 100% есть данные. Затем функция выводит данные в консоле. Все абсолютно примитивно:

main.js
// Старт программы
app.on( 'ready', function(){
   ... код создание окна и другие действия не относящиеся к подключению файла...

    // Импортировать массив с данными через 3 секунды и показать содержимое
    setTimeout(function () {
        let sceneElems = require('../renderProcess/editorJS/sceneElems').sceneElems;

        console.log(sceneElems);
    }, 3000);
} );


Но этот код выводит содержимое массива, которое было при старте программы. Если был пустой массив, то пустой, если другие данные, то это данные. А до вызова функции возвращающей содержимое массива в нем данные меняются. И такое происходит только в Основном процессе. В процессе Отображения этот код срабатывает как нужно.
Ответить с цитированием
  #7 (permalink)  
Старый 21.06.2018, 16:41
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Спасибо за ответ! Попробую в начале сохранить данные массива как файл и затем прочесть из Основного процесса.

Сообщение от Audaxviator
Всё, что загружается через require, загружается в оперативную память (даже не в кеш) и больше не изменяется.
Это особенность работы Основного процесса? Я помню теорию подключения файлов в Ноде: при подключении файла данные возвращаются в виде объекта. А у объекта доступ по ссылке. Поэтому при изменении данных они будут всегда актуальны в каждом файле. Собственно все подключаемые файлы в Процессе Отображения вели себя в соответствии с этим правилом.
Ответить с цитированием
  #8 (permalink)  
Старый 21.06.2018, 23:28
Аватар для EmperioAf
Профессор
Отправить личное сообщение для EmperioAf Посмотреть профиль Найти все сообщения от EmperioAf
 
Регистрация: 15.01.2015
Сообщений: 622

Мммммм, не надо придумывать велосипедов, если уж пользуетесь Electron, то лучше начать с чтения документации:

https://electronjs.org/docs/api/ipc-renderer
Ответить с цитированием
  #9 (permalink)  
Старый 22.06.2018, 10:46
Аспирант
Отправить личное сообщение для stweet Посмотреть профиль Найти все сообщения от stweet
 
Регистрация: 21.12.2011
Сообщений: 41

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);
});


Так же хотелось бы посмотреть файл в котором экспортируется массив.

Последний раз редактировалось stweet, 22.06.2018 в 11:01.
Ответить с цитированием
  #10 (permalink)  
Старый 22.06.2018, 11:30
Аспирант
Отправить личное сообщение для Andrew K Посмотреть профиль Найти все сообщения от Andrew K
 
Регистрация: 15.11.2014
Сообщений: 50

Спасибо 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);
});

Последний раз редактировалось Andrew K, 22.06.2018 в 11:33.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Не понимаю JavaScript. Как сделать ожидание события загрузки данных? xintrea AJAX и COMET 7 01.06.2013 17:18
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00