javascript - setInterval() 是否重新评估函数的内容?
问题描述
我正在编写一个基于 Vue(特别是 Quasar 框架)的业余 SPA。
此应用程序在mounted()
中连接到 MQTT 代理以获取一些信息(MQTT 在这里无关紧要 - 它可能是一个用 调用的 API fetch()
,关键是结果在 JS 异步方式“一段时间后”可用)。此信息存储在this.results
.
我this.results
在某些组件中使用,内容按预期显示,并按预期更新新结果(即 中的更改this.results
)。
由于这是家庭监控程序的前端,因此我还想显示上次获取结果的时间,并在一段时间内没有获得新结果时发出警报(这表明监控后端本身崩溃了)。我去了:
mounted() {
// connect to the MQTT broker = new results will come. That could be a setInterval fetch()
this.client = mqtt.connect("mqtt://mqtt.swtk.info:1884");
this.client.on("connect", this.mqttConnect);
this.client.on("message", this.mqttMessage);
// check every 900 ms for the last time I got the results, and set a variable for the elapsed time
setInterval(
function() {
console.log(this.results)
this.timeSinceLastRun = moment().unix() - moment(this.results.when).unix()
},
900
)
}
这是我不断(每秒)在控制台上收到的消息:
同时,this.results
定义:不仅来自this.results
的 cntents 以其他方式正确显示在组件中,而且在查看 DevTool Vue 选项卡时,我看到:
看起来函数this.result
中的setInterval()
仅评估一次并且是undefined
- 这很好,因为当时还没有收到它,但很快就会设置(在获得第一个结果后)。
在对函数的每个 900 毫秒调用中,它的值不应该像“当前”那样使用吗?
解决方案
尝试使用() => {}
这样的箭头功能
setInterval(
() => {
console.log(this.results)
this.timeSinceLastRun = moment().unix() - moment(this.results.when).unix()
},
900
)
推荐阅读
- swift - Swift - 使用 URLSessionStreamTask 使我的应用程序与 Firebase 数据库数据保持同步
- python - 如何授予 PyCharm 管理员权限?
- reactjs - [未处理的承诺拒绝:TypeError:未定义不是对象(评估'_expoMediaLibrary.MediaLibrary.createAssetAsync')]
- android - 未安装 React-Native Release APK
- windows - Microsoft.Assumes+InternalErrorException:文件不应依赖于自身。在 asp.net core 3.1 视觉工作室窗口上
- mysql - 字段列表说明中的未知列
- html - 添加指向 SVG 文件的链接
- firebase - 新的颤振 Firebase 身份验证包中的租户属性是什么?
- javascript - 具有枚举字段的条件逻辑
- javascript - 在页面加载后选择一个 Slick 滑块 1.3.5,以便它具有使用箭头键导航的焦点