electron-dl 我创建了一个类,用于管理下载器,class Downloader { constructor(data, options) { this.data = data; this.options = options; this.item = null; this.onStart = null; this.onProgress = null; this.onCompleted = null; this.data.progress = 0; // 新增 progress 属性 } start() { const win = BrowserWindow.getFocusedWindow(); this.options.onStarted = (item) => { this.item = item; if (this.onStart) { this.onStart(); } }; this.options.onProgress = (progress) => { this.data.progress = progress.percent * 100; // 更新 progress 属性 if (this.onProgress) { this.onProgress(progress); } }; this.options.onCompleted = () => { if (this.onCompleted) { this.onCompleted(); } }; download(win, this.data.dowloadLink, this.options); } pause() { if (this.item) { this.item.pause(); } } resume() { if (this.item) { this.item.resume(); } } cancel() { if (this.item) { this.item.cancel(); } } } 然后,我在外面监听下载器的下载完成状态。 downloader.onCompleted = () => { // 下载完成 mainWindow.webContents.send('consolelog2', item); mainWindow.webContents.send('endDownload', JSON.stringify(downloader)); mainWindow.webContents.send('donwloadStatus', false); }; 我的预加载文件中接受的是: ipcRenderer.on('endDownload', (msg,data) => { const dataTemp=JSON.parse(data) message.open({ type: 'success', content: dataTemp.data.title+'下载完成', duration: 3, top: 200 }); }); 此时如果有两个内容分别是AA、BB在下载,其中AA下载结束,弹出 AA下载完成,但是接着就弹出BB下载完成,我的目的是谁下载完成才弹出,但是这里把我没有下载完成的也弹出提示了,是怎么回事。
时间: 2024-02-05 16:02:28 浏览: 112
根据你的描述,可能是因为你的监听器 `ipcRenderer.on('endDownload', ...)` 注册在了预加载脚本中,而预加载脚本只会在应用程序启动时加载一次,因此可能会导致多个下载完成事件被同时触发,从而导致多个提示框被同时弹出。
为了避免这种情况,你可以考虑将监听器注册到主进程中,然后使用 `webContents.send()` 方法将下载完成的消息发送给渲染进程。这样做的好处是,每次下载完成时,都会触发一次 `ipcMain.on('endDownload', ...)`,从而确保只有一个提示框被弹出。具体实现方式可以参考以下代码:
在主进程中:
```
// 监听下载完成事件
ipcMain.on('endDownload', (event, data) => {
const dataTemp = JSON.parse(data);
const win = BrowserWindow.fromWebContents(event.sender);
win.webContents.send('consolelog2', dataTemp);
win.webContents.send('endDownload', dataTemp);
win.webContents.send('donwloadStatus', false);
});
```
在渲染进程中:
```
// 发送下载请求
const downloader = new Downloader(data, options);
downloader.onCompleted = () => {
ipcRenderer.send('endDownload', JSON.stringify(downloader));
};
// 监听下载完成事件
ipcRenderer.on('endDownload', (event, data) => {
const dataTemp = JSON.parse(data);
message.open({
type: 'success',
content: dataTemp.data.title+'下载完成',
duration: 3,
top: 200
});
});
```
阅读全文