Electron webContents.send не всегда работает

#javascript #electron

#javascript #electron

Вопрос:

Я использую следующее, чтобы отправить некоторые данные в другое окно;

 try{ 
    win.webContents.once('dom-ready', () => win.webContents.send('send-data', data)); 
}
catch(err){
    console.log("Caught ",err);
}   
 

И для получения;

 ipcRenderer.on('send-data', function (event,data) {     
    console.log("Loaded ", data);   
 });
 

Дело в том, что «данные» здесь иногда собираются очень быстро, и это работает нормально. Однако иногда это занимает некоторое время, а другое окно уже загружено в этот момент. В этом случае данные не принимаются, и сообщение об ошибке также отсутствует. Но тогда я могу просто использовать следующее, чтобы отправить его без проблем;

 win.webContents.send('send-data', data)
 

Я не смог найти способ подать заявку в обоих случаях. Есть предложения?

Ответ №1:

Короткий ответ — нет.

У Electron нет функции для ожидания загрузки окна, а затем отправки сообщения или отправки сообщения сразу, если окно уже загружено.

Однако это можно сделать с помощью простого кода:

 var hasWindowLoaded = false;
var hasDataBeenSent = false;
var data            = {};

win.webContents.once('dom-ready', () => {
    hasWindowLoaded = true;
    if (!hasDataBeenSent amp;amp; data) {
        win.webContents.send('send-data', data);
        hasDataBeenSent = true;
    }
});

// Now add this where you build the `data` variable.
function loadData () {
    data = {'sampleData': 'xyz'};

    if (!hasDataBeenSent amp;amp; hasWindowLoaded) {
        win.webContents.send('send-data', data);
        hasDataBeenSent = true;
    }
}
 

Как только данные будут загружены, loadData он проверит, закончена ли загрузка окна, и если да, то сразу отправляет данные.

В противном случае он сохраняет данные в переменной ( data ) и после загрузки окна отправляет их в окно.

Ответ №2:

Другой подход, который вы, возможно, захотите рассмотреть, — это отправка данных в browserWindow строки запроса using.

 const data = { hello: "world" }; // sample data

// send it using query strings
browserWindow.loadFile(YOUR_HTML_FILE_PATH, {
  query: { data: JSON.stringify(data) },
});


// parse this data in the browserWindow
const querystring = require("querystring");
const query = querystring.parse(global.location.search);
const data = JSON.parse(query["?data"]);
console.log(data); // { hello: "world" }
 

Комментарии:

1. Если data переменная собрана после загрузки окна браузера, разве вам не пришлось бы перезагружать страницу с data помощью строки запроса, чтобы окно браузера получило данные?

2. Данные будут в самом URL. Это будет в строках запроса. Тот факт, что окно браузера загружено или нет, не имеет значения.

3. @Joshua Я думаю, что я неправильно понял вопрос. Если вы используете метод строк запроса для отправки данных, вам нужно дождаться, пока данные будут собраны, а затем создать окно браузера.