nodejs 心跳回复接口

需求:
心跳函数,没有指令等60s后回复ok,当存在指令时,就立即回复该指令.
方案:
用清除定时器方法希望可以结束掉await的异步方法
操作:
我现在用一个定时器模拟一个指令,希望达到立即往下执行的效果
问题:
指令到达,清除定时器,await的异步方法因为没有resolve就没有往下执行,
所以个人觉得好像不应该用定时器,请问有其他的方法吗(已解决)
setInterval(可行):
1578540197(1).jpg
最终代码(采用setTimeout和node的emitter事件监听 注意事件器的创建和删除 防止内存泄漏):
1578561708(1).jpg

已解决 悬赏分:50 - 解决时间 2021-11-28 19:44
反对 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',
    });

    还是有两个问题:

    1. 为啥要等待 6s
    2. 指令通过什么途径触发

    先提供一个思路吧:

    把等待周期改成 50ms,用 setInterval,累计12次(约6s)之后结束;或者指令来了结束。


    好好问问题,别人才好回答

    1. 你的需求是什么?
    2. 你的方案是什么?
    3. 你做了什么?(写了)
    4. 你的问题是什么?(没写清楚)
    支持 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