代码之家  ›  专栏  ›  技术社区  ›  jla

Node.on方法触发次数过多

  •  0
  • jla  · 技术社区  · 6 年前

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

    中的函数主要.js每次单击只扫描一次目录,因此问题必须在界面.js.

    我的代码主要.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 );
    });
    

    界面.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
            }
        } );
    }
    

    ipcRenderer.on 运行多次?有没有可能每次点击按钮时它都会绑定到某个东西上,从而与过去的点击次数一样多?我在事件侦听器函数和 showDialogue 函数在 ipcRenderer 但是它们每次点击都只打印一次,所以重复肯定只来自 IPC.on公司

    2 回复  |  直到 6 年前
        1
  •  5
  •   planet_hunter    6 年前

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

    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/' );
    }
    
        2
  •  4
  •   psiphi75    6 年前

    showDialogue() 被称为。您需要删除侦听器或将侦听器移到调用函数之外。

    然而,我发现一个更干净的解决办法是使用 .once 命令。其行为类似于 .on .开 监听器(你还没做过)会自动删除。

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