开发者社区 问答 正文

退出功能,无需等待同步任务

我已经构建了一个侦听HTTP请求的node.js应用程序,该部分工作非常好。当我收到HTTP请求时,我在下面调用函数kp()。(下面的代码是一个示例,在实际的应用程序中,会有多个sleep()且时间不同等)。

我的问题是,如果另一个HTTP请求进入,我想中止kp()函数正在运行的所有先前实例,而不管该函数现在在哪里。

当搜索(这里和对谷歌),从来就发现喜欢回答这个,这我不能因为使用那我就需要等待功能完成。

有什么建议么?谁能指出我正确的方向?

function sleep(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));}

async function kp(){
    console.log("part 1");
    await sleep(5000);
    console.log("part 2");
}

展开
收起
几许相思几点泪 2019-12-02 22:57:17 454 分享 版权
阿里云 AI 助理回答

在Node.js中,要实现您描述的功能,即在收到新的HTTP请求时终止前一个请求的处理过程,可以采取以下几种策略:

  1. 使用AbortController (Node.js 14及以上版本): Node.js从v14开始原生支持AbortController,它允许你优雅地取消异步操作。首先,你需要在HTTP请求处理器中创建一个AbortController实例,并将信号传递给你的异步函数。当新请求进来时,调用abort()方法来中止正在进行的操作。

    const { AbortController } = require('node-abort-controller'); // 如果Node.js版本低于14,需要安装这个包
    
    async function handleRequest(req, res) {
       const controller = new AbortController();
       const signal = controller.signal;
    
       try {
           await kp(signal);
           // 继续处理响应...
       } catch (err) {
           if (err.name === 'AbortError') {
               console.log('Request was aborted');
           } else {
               throw err;
           }
       }
    
       res.on('close', () => {
           controller.abort(); // 当客户端断开连接时,也应中止操作
       });
    }
    
    async function kp(signal) {
       console.log("part 1");
       await sleep(5000, signal); // 修改sleep函数以接受signal参数
       console.log("part 2");
    }
    
    function sleep(ms, signal) {
       return new Promise((resolve, reject) => {
           if (signal.aborted) {
               reject(new DOMException('Aborted', 'AbortError'));
           }
           setTimeout(resolve, ms);
           signal.addEventListener('abort', () => {
               reject(new DOMException('Aborted', 'AbortError'));
           }, { once: true });
       });
    }
    
  2. 使用外部库(如cancellation-token): 如果你的Node.js版本不支持AbortController或者你想要更简单的API,可以考虑使用第三方库,如cancellation-token。这类库提供了类似的机制来控制异步操作的取消。

  3. 重写逻辑以支持可中断操作: 对于一些复杂的异步流程,可能需要手动添加检查点,在这些检查点上根据某种条件(比如全局变量或状态机的状态)决定是否继续执行。这种方法比较繁琐且容易出错,但在某些特定场景下可能是必要的。

请记住,优雅地处理取消操作意味着你的异步代码需要能够响应这种取消信号,并在接收到信号时清理资源、释放锁或停止进一步的操作。上述示例展示了如何通过AbortController集成这一机制。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: