gpt4 book ai didi

javascript - Node .on 方法触发次数过多

转载 作者:行者123 更新时间:2023-11-30 11:14:37 25 4
gpt4 key购买 nike

我有一个 Electron 应用程序可以向用户显示目录列表。当用户单击按钮时,我的界面脚本 interface.js 会清除容器 div 并向 main.js 发送一条消息。收到消息后,main.js 将目录扫描到文件名数组中,并将该数组作为响应返回给 interface.js。 Interface.js 使用 .on 方法,该方法在收到响应时触发并使用数组的内容更新容器 div。

这是我第一次真正尝试使用 Node,就界面行为而言,一切都很顺利!太棒了,才几个小时,我就爱上了 Node!

但是,在调试/压力测试时,我将 .on 方法中返回的数组打印到控制台并注意到一些奇怪的行为。用户第一次单击按钮时,.on 方法运行一次(通过向控制台发送一条消息进行验证)。第二次用户点击时,该方法运行两次(通过发送到控制台的两条消息验证);第三次运行三次,依此类推。

main.js 中扫描目录的函数每次点击只运行一次,所以问题一定在 inteface.js 中。

我的 main.js 和 interface.js 代码:

主要.js:

const {app, BrowserWindow, ipcMain} = require('electron');
const fs = require('fs');

...

ipcMain.on( 'list-directory', ( event, directory ) => {
var files = fs.readdirSync( directory );
event.sender.send( 'list-directory-reply', files );
});

接口(interface).js

var { ipcRenderer, remote } = require( 'electron' );  
var main = remote.require( "./main.js" );

...

button.addEventListener('click', function(){ showDialogue( this ); }, false );

...

showDialogue( select ) {
// clear the dialogue
// some other stuff
ipcRenderer.send( 'list-directory', './files/documents/' );
ipcRenderer.on( 'list-directory-reply', function( event, contents ) {
console.log( contents );
if ( contents.length > 0 ) {
// add contents to the dialogue
}
} );
}

代码改编自 Electron 网站上的教程。

为什么ipcRenderer.on会运行多次?每次单击按钮时它是否有可能绑定(bind)到某些东西,因此运行次数与过去的点击次数一样多?我在事件监听器函数中和 showDialogue 函数中 ipcRenderer 之前放置了一个打印语句,但它们每次点击只打印一次,所以重复肯定只会出现来自 ipcRenderer.on

最佳答案

您在每次单击按钮后订阅 ipcRenderer.on,这会导致多个订阅。尝试在点击事件之外定义 ipcRenderer.on 事件处理程序,它应该可以正常工作。

是这样的——

button.addEventListener('click', function(){ showDialogue( this ); }, false );


ipcRenderer.on( 'list-directory-reply', function( event, contents ) {
// ipcRenderer event handler
});

showDialogue(select) {
ipcRenderer.send( 'list-directory', './files/documents/' );
}

关于javascript - Node .on 方法触发次数过多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52111151/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com