Nano Hash - криптовалюты, майнинг, программирование

Electron: X не работает ››› (Обратный вызов с использованием ipcrenderer / ipcmain)

Проблема
Я использую обещания, чтобы получить обратный вызов при загрузке библиотек. Каждое обещание отправляет сообщение через ipcRenderer в ipcMain и включает функцию обратного вызова.

Функция обратного вызова вызывается, как и ожидалось, но отображает ошибку: «Успех не является функцией» (посмотрите на следующий код).

Окно:

function loadLibrary() {
    loadLibraryExtension('Database Manager', 'db').then(() => {
        return loadLibraryExtension('Path Extesnion', 'path');
    }).then(() => {
        return loadLibraryExtension('Excel Extension', 'excel4node');
    }).then(() => {
        return loadLibraryExtension('Auto updater', 'autoupdater');
    }).then(() => {
        onLibrariesLoaded();
    });
}

var loadLibraryExtension = (status, library) => {
    return new Promise(function (resolve, reject) {
        $('#current-load').html(status);
        ipcRenderer.send('load',
            library,
            resolve(),
            reject()
        );
    });
}

Основной процесс:

var db;
var path;
var excel;
var autoUpdater;

var load = {
    'db': () => { db = require('./dbmanager.js'); },
    'path': () => { path = require('path'); },
    'excel4node': () => { excel = require('excel4node'); },
    'autoupdater': () => { 
        autoUpdater = require('electron-updater');
        autoUpdater.autoDownload = false;
        autoUpdater.autoInstallOnAppQuit = false;
    }
}

ipcMain.on('load', function (event, library, succes, error) {
    try {
        load[library]();
    } catch (err) {
        Error(err);
        error(err);
        return;
    }
    succes();
});

Я не ожидаю появления каких-либо ошибок, но я постоянно получаю

TypeError: succes is not a function
    at EventEmitter.<anonymous> (C:\git\library-system\src\main.js:40:3)
    at EventEmitter.emit (events.js:194:13)
    at WebContents.<anonymous> (C:\git\library-system\node_modules\electron\dist\resources\electron.asar\browser\api\web-contents.js:390:13)
    at WebContents.emit (events.js:194:13)
TypeError: succes is not a function
    at EventEmitter.<anonymous> (C:\git\library-system\src\main.js:40:3)
    at EventEmitter.emit (events.js:194:13)
    at WebContents.<anonymous> (C:\git\library-system\node_modules\electron\dist\resources\electron.asar\browser\api\web-contents.js:390:13)
    at WebContents.emit (events.js:194:13)
TypeError: succes is not a function
    at EventEmitter.<anonymous> (C:\git\library-system\src\main.js:40:3)
    at EventEmitter.emit (events.js:194:13)
    at WebContents.<anonymous> (C:\git\library-system\node_modules\electron\dist\resources\electron.asar\browser\api\web-contents.js:390:13)
    at WebContents.emit (events.js:194:13)
TypeError: succes is not a function
    at EventEmitter.<anonymous> (C:\git\library-system\src\main.js:40:3)
    at EventEmitter.emit (events.js:194:13)
    at WebContents.<anonymous> (C:\git\library-system\node_modules\electron\dist\resources\electron.asar\browser\api\web-contents.js:390:13)
    at WebContents.emit (events.js:194:13)

Ответы:


1

Вы отправляете аргументы в рендерер

ipcRenderer.send('load', library, resolve(), reject());

и пытаюсь получить в основном процессе

function (event, library, succes, error) {...

Во-первых, вы отправили resolve(), что не является началом функции. Promise.resolve() возвращает обещание, а не функцию.

Во-вторых, дизайн IPC Electron не позволяет отправлять несериализуемое значение. Короче говоря, вы не можете отправить функцию и выполнить ее в другом процессе. Вы должны отправить сигнал обратно рендереру через webContents.send или event.sender.send из основного процесса, а затем позволить процессу рендеринга разрешить обещание в процессе.

05.06.2019
  • Потрясающий! ipcRenderer.on('load-callback', (event, status) => { status; }); и немного wm.Main.window.webContents.send('load-callback', succes); решили проблему. Спасибо 05.06.2019
  • Новые материалы

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

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..