Bootstrap

electron中dialog.showSaveDialog on执行多次

在electron项目中,通常使用保存对话框或者其他对话框时会使用electron的ipcMain和dialog

// main.js
const {app, BrowserWindow, ipcMain, dialog} = require('electron');
ipcMain.on('save-file-dialog', function (event) {
    let startPath = 'target/output';
    if (process.platform === 'win32') {
        startPath = process.cwd() + '\\target\\output\\output.csv'
    }
    dialog.showSaveDialog({
        title: 'Save a file...',
        defaultPath: startPath,
        buttonLabel: "save...",
        filters: [
            {name: 'csv', extensions: ['csv']}
        ]
    }).then(r => {
        if (r.filePath) event.sender.send('savedItem', r.filePath)
    })
})
// index.js
const ipcSave = require('electron').ipcRenderer;
function demo() {
    ipcSave.send('save-file-dialog');
    ipcSave.on('savedItem', function (event, path) {
        console.log(path);
        // 函数内容
    });
}

这里会因为多次调用demo函数而增加on的监听次数,导致多次触发。

一般解决方法有两种:

// 第一种
function demo() {
    ipcSave.send('save-file-dialog');
    ipcSave.once('savedItem', function (event, path) {
        console.log(path);
        // 函数内容
    });
}

// 第二种
function demo() {
    ipcSave.send('save-file-dialog');
}
ipcSave.on('savedItem', function (event, path) {
    console.log(path);
    // 函数内容
});

;