Javascript Electron-ipc sendSync-在回调中返回event.returnValue
在我的渲染器进程(web页面)中,我同步发送一条消息,以便将页面打印为PDF 在Javascript Electron-ipc sendSync-在回调中返回event.returnValue,javascript,electron,Javascript,Electron,在我的渲染器进程(web页面)中,我同步发送一条消息,以便将页面打印为PDF 在window.webContents.printToPDF的回调中,我返回了event的returnValue。但是回调从未被调用。我使用VSCode来确认这一点 当异步尝试相同的进程时,它可以正常工作 代码: 渲染器: 主要流程: 更新: 操作系统:Windows 10、Windows 7 电子版:0.37.4 问题演示: 复制回购协议 运行应用程序并单击“打印到pdf” 我无法复制。当您的代码在渲染器进程中
window.webContents.printToPDF的回调中,我返回了event的returnValue。但是回调从未被调用。我使用VSCode来确认这一点
当异步尝试相同的进程时,它可以正常工作
代码:
渲染器:
主要流程:
更新:
- 操作系统:Windows 10、Windows 7
- 电子版:0.37.4
问题演示:
复制回购协议
运行应用程序并单击“打印到pdf”
我无法复制。当您的代码在渲染器进程中运行时,您是否在开发工具中看到任何错误?@ShawnRakowski我能够在一个新的环境中复制相同的错误。我已使用repo url和更多详细信息更新了问题。请查看它。我现在看到了您的困境,我误解了未能调用的内容。我还没有找到任何东西来证实这一点,但我的直觉告诉我webcontent.printToPDF要求渲染器进程的线程可以执行此活动,但在等待sendSync()调用的响应时被卡住了。驱动它同步的要求是什么?@ShawnRakowski我希望同步执行的原因是在打印操作成功执行之前不允许用户交互。但在出现此问题后,我又恢复使用异步调用,并使用其他UI手段限制用户操作。但由于此问题(可能是预期行为)是存在的,我想对它有更好的了解。
var params = {
"path": undefined,
"filename": vm.profile._id + " " + vm.profile.firstname
}
let result = ipcRenderer.sendSync('print-profile-pdf', params);
ipcMain.on('print-profile-pdf', function(event, params) {
printToPdf(params.path, params.filename, event);
});
function printToPdf(path, filename, event) {
var options = {
marginsType: 2,
pageSize: "A4",
printBackground: false,
printSelectionOnly: false,
landscape: false
};
let file = (path || app.getPath("desktop")) + "/" + (filename || "profile") + ".pdf";
previewWindow.webContents.printToPDF(options, function(error, data) {
if (error) {
logger.error(error);
event.returnValue = {
error: error,
success: false
};
throw error;
}
fs.writeFile(file, data, function(error) {
if (error) {
logger.error(error);
event.returnValue = {
error: error,
success: false
};
throw error;
}
logger.info("PDF Saved Successfully in " + filename);
event.returnValue = {
filename: filename + ".pdf",
success: true
};
});
});
};