需求:
心跳函数,没有指令等60s后回复ok,当存在指令时,就立即回复该指令.
方案:
用清除定时器方法希望可以结束掉await的异步方法
操作:
我现在用一个定时器模拟一个指令,希望达到立即往下执行的效果
问题:
指令到达,清除定时器,await的异步方法因为没有resolve就没有往下执行,
所以个人觉得好像不应该用定时器,请问有其他的方法吗(已解决)
setInterval(可行):
最终代码(采用setTimeout和node的emitter事件监听 注意事件器的创建和删除 防止内存泄漏):
已解决
悬赏分:50
- 解决时间 2021-11-28 19:44
点赞 0反对 0举报 0
收藏 0
分享 0
回答3
最佳
-
所以这其实是个心跳脚本嘛,没请求就发心跳,有请求就发请求,那你不应该用 asynchronous function,直接写个全局心跳对象就好了:
// heartbeat.js let interval; export default { start() { interval = setInterval(() => { sendHeartBeat(); }, 6000); }, stop() { cleartInterval(interval); }, } // request.js import hb from './heartbeat.js'; function doRequest() { } export default { async post(url, data) { hb.stop(); const result = await doRequest(url, data) hb.start(); return result; }, } // index.js import http from './requrest.js'; post(url, { name: 'meathill', });
还是有两个问题:
- 为啥要等待 6s
- 指令通过什么途径触发
先提供一个思路吧:
把等待周期改成 50ms,用 setInterval,累计12次(约6s)之后结束;或者指令来了结束。
好好问问题,别人才好回答
- 你的需求是什么?
- 你的方案是什么?
你做了什么?(写了)- 你的问题是什么?(没写清楚)
支持 0 反对 0 举报2021-11-28 08:16
-
不太理解你怎么处理这个返回结果,但大致就是需要一个监听器。如果有持续调用,则监听器复位重新监听,大于6秒没有指令监听器会执行某些操作
let global = { timer: undefined }; const resetTimer = (callback) => { if (global.timer !== undefined) { clearTimeout(global.timer); } global.timer = setTimeout(() => { clearTimeout(global.timer); global.timer = undefined; callback('stopped'); }, 6000); } function request(ctx) { resetTimer((result) => { ctx.body = result; return; }); /// 执行你的操作 }
支持 0 反对 0 举报2021-11-28 09:06
-
const demo = immediate => new Promise(resolve => setTimeout(resolve, !immediate&&6000||0));
支持 0 反对 0 举报2021-11-28 09:21