Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在ES6类中停止setInterval_Javascript_Node.js_Ecmascript 6_Setinterval - Fatal编程技术网

Javascript 在ES6类中停止setInterval

Javascript 在ES6类中停止setInterval,javascript,node.js,ecmascript-6,setinterval,Javascript,Node.js,Ecmascript 6,Setinterval,我只想测试多个MQTT客户端在节点v8.9.1应用程序中以不同的间隔发送消息。目前,即使只有一个客户端,该代码也会失败。我无法理解为什么clearInterval不在这个类中工作: 常量mqtt=需要'mqtt'; 导出默认类MQTTClient{ 构造函数URL,conf,period{ this.url=url; this.conf=conf; 这个周期=周期; 此参数为0; this.client=null; this.interval=null; } getTotalMessages{

我只想测试多个MQTT客户端在节点v8.9.1应用程序中以不同的间隔发送消息。目前,即使只有一个客户端,该代码也会失败。我无法理解为什么clearInterval不在这个类中工作:

常量mqtt=需要'mqtt'; 导出默认类MQTTClient{ 构造函数URL,conf,period{ this.url=url; this.conf=conf; 这个周期=周期; 此参数为0; this.client=null; this.interval=null; } getTotalMessages{ 返回此消息; } 连接{ this.client=mqtt.connectthis.url,this.conf; this.client.on'connect',=>{ this.interval=setInterval=>{ this.client.publish`u${this.conf.clientId}`、'Hello mqtt'; 该值为+1; 如果此值为0.messages==3{ clearIntervalthis.interval; console.logthis.interval; 这是client.end; } },这段时间; }; this.client.on'error',error=>{ console.error`${this.conf.clientId}error`,error; }; } } console.log语句实际上打印如下内容:

Timeout {
    '0': null,
    _called: false,
    _idleTimeout: -1,
    _idlePrev: null,
    _idleNext: null,
    _idleStart: 5580,
    _onTimeout: null,
    _timerArgs: undefined,
    _repeat: null,
    _destroyed: false,
    [Symbol(asyncId)]: 134,
    [Symbol(triggerAsyncId)]: 123 }
更完整地说,我在用Jest进行的单元测试中调用这个类:

测试“多个MQTT消息”,完成=>{ 常量mqttURL=`mqtt://localhost:${config.moscaSettings.port}`; expectconfig.moscaSettings.port.toBe1883; 常量配置={ clientId:concurrencyTokens[0]。值, 用户名:concurrencyTokens[0]。所有者, 密码:concurrencyTokens[0]。值, }; const mqttClient=new MQTTClientmqttURL,conf,1000; mqttClient.connect; //五秒钟后终止测试 setTimeoutasync=>{ const res=wait Messages.remove{userName:user}.exec; expectmqttClient.getTotalMessages.toBe3; 期望的结果;期望的结果; 完成; }, 5000; }, 10000; 所以我不明白为什么它不起作用。使用arrow函数可以保证这是对类的引用,但interval不会停止。
有什么想法吗?

你正在做的事情的简化版本很好。验证对此.property的每个引用是否正确。还要确认您没有在OnError着陆

var c=函数{ 让间隔; 让计数=0; 让express==>{ 间隔=设置间隔=>{ 计数++; 如果计数===3{ 清晰间隔; } console.loginterval; }, 100; }; 返回{onThing:express}; };
c、 关于 正如@CharlieMartin在一篇评论中指出的,我发现connect被多次调用,但这是另一个问题,因此用所有间隔引用填充数组解决了这个问题。我还可以通过记录setInterval对象并查看它在某些打印中具有不同的[SymbolasyncId]来检测它。 谢谢你的支持

this.client.on'connect',=>{ 控制台。登录“连接”; const interval=setInterval=>{ this.client.publish`u${this.conf.clientId}`、'Hello mqtt'; 该值为+1; 如果此值为0.messages==3{ 这是间隔时间; 这是client.end; } },这段时间; 这个.interval.pushinterval; };
有多少客户?如果它不止一个,则第二个间隔等将覆盖上一个间隔,从而使其无法阻止,因为您丢失了对它的引用。必须多次执行connect,以创建多个间隔。确认这一点的一个好方法是将全局变量interval更改为数组,并将该interval推送到该数组,然后稍后检查它。它可能有多个间隔,您可以循环并清除它们all@KevinB:目前它不能只使用一个变量,但可以在类内移动interval变量,所以这不是问题。@CharlieMartin:connect应该每个客户端只调用一次。目前我只为一个客户端调用一次。我不知道这是否只是一个输入错误,但您不应该将setInterval调用结果分配给这个。interval而不是interval?-考虑到编辑历史,我认为这是一个输入错误:你应该重新编辑你的帖子谢谢,我确定我没有登录到OneError,在该函数中有一个控制台。错误,我还可以看到发布了3条以上的消息。我知道这可以用其他方式编写,我想知道这个实现有什么问题很高兴你找到了答案。