Передайте результат запроса для просмотра - PullRequest
2 голосов
/ 10 апреля 2019

Я новичок в Electron, и я застрял с тем, как передать результат запроса для просмотра.

Вот файл js:

const request = require('request');

let serverUrl = 'http://localhost:3000/api';

request.get({
    url: serverUrl + '/properties'
}, handleResponse);

var properties = {};

function handleResponse(error, response, body) {
    properties = JSON.parse(response.body);
    console.log(properties);
}

А вот HTML-часть:

<div class="block">
    <div class="title">General</div>
    <script>
        const { remote } = require('electron');
        console.log(properties);
        for (var i in remote.properties) {
            document.write('<p>' + remote.properties[i] + '</p>');
        }
    </script>

Я знаю, что запрос асинхронный, и поэтому console.log(properties) из представления печатает {}. Так есть ли способ отправить результат запроса в представление?

Ответы [ 2 ]

4 голосов
/ 10 апреля 2019

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

Опция 1: Запрос и обработка в рендере

<!DOCTYPE html>
<html>
<body>

</body>
<script type="text/javascript">

    const request = require('request')

    let serverUrl = 'http://localhost:3000/api'

    request.get({
        url: serverUrl + '/properties'
    }, handleResponse)

    function handleResponse(error, response, body) {
        properties = JSON.parse(response.body)
        for (var i in properties) {
            document.write('<p>' + properties[i] + '</p>')
        }
    }

</script>
</html>

Опция 2: Запрос в основном, отправка ответа рендереру

Main:

const request = require('request')
let serverUrl = 'http://localhost:3000/api'

request.get({
    url: serverUrl + '/properties'
}, handleResponse)

function handleResponse(error, response, body) {
    properties = JSON.parse(response.body)
    mainWindow.webContents.send('my_message', properties)
}

Рендерер:

<!DOCTYPE html>
<html>
<body>

</body>
<script type="text/javascript">

    require('electron').ipcRenderer.on('my_message', function(e, message) {
        console.log(message)
        for (var i in message) {
            document.write('<p>' + message[i] + '</p>');
        }
    });

</script>
</html>
2 голосов
/ 10 апреля 2019

Наконец-то я нашел решение, заключив запрос в функцию с обратным вызовом, как показано ниже:

function getProperties(callback) {
    request.get({
        url: serverUrl + '/properties'
    }, function (error, response, body) {
        callback(JSON.parse(response.body));
    });
}

Теперь из представления мне просто нужно вызвать getProperties:

<div class="block">
    <div class="title">General</div>
    <script>
        getProperties((properties) => {
            console.log(properties);
        });
    </script>
</div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...