电子-从Main到Renderer的消息导致空对象

时间:2018-11-16 18:25:09

标签: javascript json electron ipc

我有一个Electron应用程序,它通过IPC(使用Electron内置的ipcRenderer.send())将文件元数据作为对象从Main进程发送到Renderer进程。

我的问题是,发送此元数据时,有一个Set对象的属性变成了空白对象。在我的文件元数据的toJSON()方法中,它将Set转换为数组,如下所示:

toJSON() {
    let copy = Object.assign({}, this);
    copy.tags = Array.from(copy.tags);
    return copy;
}

在调试器中逐步执行主进程和渲染器进程时,Electron似乎从未调用过toJSON()方法(尽管在其他地方对元数据对象进行序列化时会调用它)。

我假设Set在序列化期间成为空白对象,但是为什么Electron在通过IPC发送数据之前不调用toJSON()?以及如何正确转换对象?

编辑:让我提供更好的解释和示例。见下文

这是前端渲染器过程中调用的函数:

function getFile(...args) {
    return new Promise((resolve, reject) => {
        let result = ipcRenderer.sendSync('getFile', ...args);
        resolve(result);
    });
}

以下是主进程中响应该消息的代码:

ipcMain.on('getFile', async (event, ...args) => {
    let result = await myGetFileFunc(...args); // myGetFileFunc returns an instance of File()

    event.returnValue = result || false;
});

这里是File类,其中myGetFileFunc返回以下实例:

class File() }

    constructor() {
        this.tags = new Set();
    }

    getTags() {
        return this.tags;
    }

    setTags(tags) {
        this.tags = tags;
    }

    prepareForJSON() {
        let copy = Object.assign({}, this);
        copy.tags = Array.from(copy.tags);

        return copy;
    }
}

最后,这是Tag类:

class Tag {
    constructor(id, name) {
        this.id = id;
        this.name = name;
    }

    toJSON() {
        return {
            id: this.id,
            name: this.name
        };
    }

总而言之,渲染器进程调用ipcRenderer.send(),主进程以文件对象作为响应,其中包括SetTag,但是在渲染器中接收到文件对象后过程中,其中包含Set的{​​{1}}成为一个空对象Tag

0 个答案:

没有答案