Электрон: есть ли способ получить доступ / изменить основной массив процессов через ipc - PullRequest
0 голосов
/ 17 мая 2018

Как правило, массивы, пропущенные через электронный ipc, копировались.

// main process
global['test'] = []
// renderer process
console.log(remote.getGlobal('test')) // []
remote.getGlobal('test').push('1')
console.log(remote.getGlobal('test')) // expected: ['1'], actual: []

Но изменить объект будет хорошо.

// main process
global['test'] = {a: 1}
// renderer process
console.log(remote.getGlobal('test')) // {}
remote.getGlobal('test').a += 1
console.log(remote.getGlobal('test')) // expected/actual: {a: 2}

Чтобы иметь возможность напрямую изменять массив из основного процесса в процессе рендерера, я попытался передать прокси, который обернул массив в основном процессе:

// Main Process Code
const real = []
global['proxy'] = new Proxy({}, {
  get: (_, property) => Reflect.get(real, property),
  set: (_, property, value, receiver) => Reflect.set(real, property, value, receiver),
  deleteProperty: (_, property) => Reflect.deleteProperty(real, property),
  enumerate: (_) => Array.from(Reflect.enumerate(real)),
  ownKeys: (_) => Reflect.ownKeys(real),
  has: (_, property) => Reflect.has(real, property),
  defineProperty: (_, property, descriptor) => Reflect.defineProperty(real, property, descriptor),
  getOwnPropertyDescriptor: (target, property) => {
    let descriptor = Object.getOwnPropertyDescriptor(real, property)
    if (descriptor) {
      descriptor.value = real[property]
      Reflect.defineProperty(target, property, descriptor)
    }
    return descriptor
  }
})

// Renderer Process Code
const proxy = remote.getGlobal('proxy')

proxy.push(1) // error thrown: Uncaught TypeError: proxy.push is not a function
console.log(proxy.join(','))

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

1 Ответ

0 голосов
/ 17 мая 2018

Это должно работать.Первый основной процесс:

//global array
global.test = {
 myarr: [3]
};

//...electron setup: window etc...

setTimeout(function() {
 console.log(global.test); //now shows 3 and 6
},5000);

В рендере (например, скрипт index.html):

var remote = require('electron').remote;

var _old = remote.getGlobal('test').myarr;
_old.push(6);

remote.getGlobal('test').myarr = _old; //update global with altered array

console.log(remote.getGlobal('test').myarr); //now shows 3 and 6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...