我的桌面应用程序可以通过 Nodemailer 从 Quasar / Electron 发送 SMTP 电子邮件。这实际上效果很好。
但是,如果 electro-preload.js 中的脚本产生错误,则我的 Quasar .vue 页面已经完成,而 electro-preload 脚本仍在运行。因此,在电子邮件发送后,如果出现错误,我无法使用已经完成的 .vue(渲染器)页面捕获它。
我已经用谷歌搜索了几天,看看是否有办法让电子预加载异步运行,以便我的 .vue 页面在完成之前等待结果。我没有找到解决方案。
我的用户将他们的 SMTP 电子邮件标准保存在数据库中,因此我需要将其以及其他信息发送到 electro-preload.js,以便可以正确生成电子邮件然后发送出去。
我一直在尝试各种方法来获取预加载以发回我需要的信息..我可以完成该任务,但每次我的 .vue 页面首先完成时,我无法捕获错误,因此我可以显示它给用户。我可以在控制台上看到它,但在我想要的时候却看不到。
电子预加载似乎并不能真正异步工作。我找到了一些例子,但我很难让它们适用于我的情况。我将不胜感激任何帮助。
这是我的工作代码:
渲染器(.vue)文件:
const res = await myAPI.sendTheEmail(
this.attachButtonToggle,
this.stringifiedemailSMTPLoginArray,
this.stringifiedemailsSubjBodyArray,
this.stringifiedemailSendToPeopleArray,
this.theEventType,
emailType,
)
console.log(' emailSetup.vue sendTheEmail res: ', res)
这是我的 electro-preload.js 中的脚本:
contextBridge.exposeInMainWorld('myAPI', {
sendTheEmail: (numOfAttach, stringifiedEemailInfoArray, stringifiedemailDetailsArray, stringifiedEtheEmailArray, theEventType, emailType) => {
const result = transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log("there is an error but this works - ERROR " + error)
return result
} else {
console.log('Email sent: ' + info.response)
return result
}
})
}
}
这根本不是预加载甚至 Electron 相关的问题。你有一个函数(我假设)只能与回调一起使用,但你需要一个Promise。所以你需要自己创建 Promise:
sendTheEmail: (
numOfAttach,
stringifiedEemailInfoArray,
stringifiedemailDetailsArray,
stringifiedEtheEmailArray,
theEventType,
emailType
) => (
new Promise((resolve, reject) => {
transporter.sendMail(mailOptions, (error, info) => {
if (error) {
console.log("there is an error but this works - ERROR " + error);
reject(error); // Or `resolve` if you don't want an error to be thrown
} else {
console.log('Email sent: ' + info.response);
resolve(info.response);
}
});
})
);