函数在Javascript中不正确地返回重复记录

函数在Javascript中不正确地返回重复记录,javascript,node.js,Javascript,Node.js,我尝试为我网页上的每个过滤器创建一个事件侦听器,我想记录下哪个过滤器被更改了。虽然我的代码确实正确地跟踪了它,但它返回的是重复的记录,而不是单个条目。我怀疑这是因为我可能没有正确地注销过滤器处理程序函数,但我在这里完全是新手 <script> window.onload = tableau.extensions.initializeAsync().then(() => { let dashboard = tableau.extensio

我尝试为我网页上的每个过滤器创建一个事件侦听器,我想记录下哪个过滤器被更改了。虽然我的代码确实正确地跟踪了它,但它返回的是重复的记录,而不是单个条目。我怀疑这是因为我可能没有正确地注销过滤器处理程序函数,但我在这里完全是新手

<script>

        window.onload = tableau.extensions.initializeAsync().then(() => {
            let dashboard = tableau.extensions.dashboardContent.dashboard;
            let dashboardName 
            let worksheetNames = []
            let filterName = []
            let unregisterFilterHandlerFunctions = []

            dashboardName = dashboard.name
            document.getElementById("dashboardName").innerHTML=dashboardName; 

            function getDateTimestamp(){
                var today = new Date();
                var date = today.getFullYear()+'-'+(today.getMonth()+1)+'-'+today.getDate();
                var time = today.getHours() + ":" + today.getMinutes() + ":" + today.getSeconds();
                var dateTime = date+' '+time;
                return dateTime;
            }

            function unregisterFilterHandlers() {
                unregisterFilterHandlerFunctions.forEach(function (unregisterFilterHandlerFunction) {
                    unregisterFilterHandlerFunctions();
                });
            }

            function registerFilterHandlers() {
                dashboard.worksheets.forEach(function (worksheet) {
                    let unregisterHandlerFunction = worksheet.addEventListener(tableau.TableauEventType.FilterChanged,filterChangeHandler);
                    unregisterFilterHandlerFunctions.push(unregisterHandlerFunction);
                });
            }

            function filterChangeHandler(filterEvent){
                const details = {
                    method: 'POST'
                };
                fetch(`https://serverurl/${filterEvent.fieldName}/Filter/${getDateTimestamp()}/${dashboardName}`, details).then((res) => {console.log(res);});
                unregisterFilterHandlers();
                registerFilterHandlers();
            }
          
            registerFilterHandlers();
</script>
最后,这是我得到的输出。虽然我只在前端更改了一个过滤器,但它呈现了指向同一过滤器的6条不同消息


标准DOM
.addEventListener
返回
未定义的
,因此有可能
让unregisterHandlerFunction
只是
未定义的
-您可以尝试注销它并检查它是否包含值吗?如果是这样的话,我希望每次触发后您都会看到一条额外的POST消息,因为它从未被注销(所以第一次提交时会有一条消息,然后是2条,然后是3条,依此类推)运行此操作后:让unregisterHandlerFunction=worksheet.addEventListener(tableau.TableauEventType.FilterChanged,filterChangeHandler);document.getElementById(“handler”).innerHTML=unregisterHandlerFunctionHmm,那不是问题所在。它可能多次触发
FilterChanged
事件,可能每个工作表触发一次?我将添加
console.log(filterEvent)
作为
filterChangeHandler
的第一行,并查看事件的每个副本是否以任何方式显示不同(可能它有一个可用于区分的工作表ID)。您的怀疑是对的。在一个特定工作表上创建过滤器时,可以将其应用于影响多个工作表。查看控制台,我看到它对返回的调用产生影响的每个工作表都有一个工作表名称。但是,由于需要针对工作表对象添加侦听器,我不知道如何避免当前行为。如果您只想通知服务器当前工作表的筛选器更改,可以使用
workbook.getActiveSheet()获取当前工作表
然后在
filterChangeHandler
中忽略其他工作表的事件,类似于
const-activeSheet=workbook.getActiveSheet();if(event.sheet.name!==activeSheet.name)返回(我不熟悉API,您可能需要稍微调整名称)。谢谢您的建议。我用你在这里提供的函数替换了我的函数,但是我仍然得到相同的结果。我应该删除unregisterFilterHandlers()函数,还是应该只对上面粘贴的函数进行更改?
const app = require('express')();
const https = require('https');
const fs = require('fs');

app.get('/', (req, res) => {
    res.writeHead(200, {'Content-Type': 'text/html'});
  var readStream = fs.createReadStream('index.html','utf8');
  readStream.pipe(res);
});

app.post('/:fieldName/:flag/:time/:dashboard', async (req, res) => {
    console.log('POST message received', req.params);
    if (req.params && req.params.fieldName) {
        await fs.appendFileSync('./changeLog.csv', `${req.params.fieldName},${req.params.flag},${req.params.time},${req.params.dashboard}\n`);
    }
});
function registerFilterHandlers() {
    dashboard.worksheets.forEach(function (worksheet) {
        worksheet.addEventListener(tableau.TableauEventType.FilterChanged, filterChangeHandler);
        unregisterFilterHandlerFunctions.push(
          () => worksheet.removeEventListener(tableau.TableauEventType.FilterChanged, filterChangeHandler)
        );
    });
}