Javascript 在ES6类中停止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{ 返回此消息; } 连接{ 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语句实际上打印如下内容: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{
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条以上的消息。我知道这可以用其他方式编写,我想知道这个实现有什么问题很高兴你找到了答案。