【问题标题】:Electron: X is not a fuction >>> (Callback using ipcrenderer / ipcmain)Electron:X 不是函数 >>>(使用 ipcrenderer / ipcmain 回调)
【发布时间】:2019-06-05 17:43:55
【问题描述】:

问题
我正在使用 Promise(s) 在加载库时获取回调。每个promise都通过ipcRenderer向ipcMain发送一条消息,并包含一个回调函数。

回调函数按预期调用,但显示错误:“Succes is not a function”(查看以下代码)。

窗口:

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)

【问题讨论】:

    标签: javascript node.js function callback electron


    【解决方案1】:

    您正在渲染器中发送参数

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

    并尝试在主进程中接收

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

    首先,您发送了resolve(),这不是函数的开始。 Promise.resolve() 返回 Promise,而不是函数。

    其次,Electron 的 IPC 的设计不允许发送不可序列化的值。简而言之,您不能发送函数并在其他进程中执行它。您应该从主进程通过webContents.sendevent.sender.send 将信号发送回渲染器,然后让渲染器进程在进程中解析promise。

    【讨论】:

    • 太棒了! ipcRenderer.on('load-callback', (event, status) =&gt; { status; }); 和一点点wm.Main.window.webContents.send('load-callback', succes); 解决了这个问题。谢谢
    猜你喜欢
    • 1970-01-01
    • 2021-11-02
    • 2016-08-01
    • 2018-12-29
    • 2018-10-03
    • 2021-08-01
    • 2021-07-22
    • 2021-11-29
    • 1970-01-01
    相关资源
    最近更新 更多