Meteor.js长时服务端方法执行后无法停止进度更新的问题
解决方案:用clearInterval停止进度更新
当然可以用clearInterval解决这个问题,这正是处理这类定时重复任务停止需求的标准方案。你的代码问题在于没有保存定时器的ID,也没有在进度达到100%时触发停止逻辑。
修改后的服务端方法代码如下:
Meteor.methods({ 'tasks.Create'() { if (!this.userId) { throw new Meteor.Error('Not authorized.'); } const id = TasksCollection.insert({ progressionInPercentage: 0, createdAt: new Date(), userId: this.userId, }); // 保存定时器ID,用于后续停止任务 const intervalId = Meteor.setInterval(() => { const task = ExportsCollection.findOne({ _id: id }); // 处理文档不存在的边界情况 if (!task) { Meteor.clearInterval(intervalId); return; } const currentProgression = task.progressionInPercentage; if (currentProgression >= 100) { // 进度已达100%,停止定时器并修正进度值 ExportsCollection.update({ _id: id }, { $set: { progressionInPercentage: 100 } }); Meteor.clearInterval(intervalId); return; } // 进度未达标,继续更新 ExportsCollection.update( { _id: id }, { $set: { progressionInPercentage: currentProgression + 5 } } ); }, 1000); }, });
关键修改说明:
- 用
intervalId变量保存Meteor.setInterval的返回值,这个ID是停止定时器的唯一标识 - 增加文档存在性检查,避免因文档被删除导致的报错
- 当进度达到或超过100%时,先将进度修正为100,再调用
Meteor.clearInterval(intervalId)终止定时任务,彻底停止UI更新 - 确保进度不会超过100%,避免出现异常数值
内容的提问来源于stack exchange,提问作者bssyy78
相关产品推荐
相关产品推荐

