首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何取消之前的express请求,以便执行新的请求?

如何取消之前的express请求,以便执行新的请求?
EN

Stack Overflow用户
提问于 2020-05-11 17:12:07
回答 1查看 65关注 0票数 1

我有这个端点。此接口获取响应的时间较长。

代码语言:javascript
复制
app.get('/api/execute_script',(req,res) =>{
//code here
}

我有以下终结点,它将终止进程

代码语言:javascript
复制
app.get('/api/kill-process',(req,res) => {
//code here
}

但是除非第一个api得到响应,否则第二个api不会被执行。如何取消上一次api请求并执行第二次请求?

EN

回答 1

Stack Overflow用户

发布于 2020-05-11 17:35:52

您可以使用EventEmitter杀死另一个进程,您所需要的只是一个会话/用户/进程标识符。

代码语言:javascript
复制
const EventEmitter = require('events');
const emitter = new EventEmitter();

app.get('/api/execute_script', async(req,res,next) => {

  const eventName = `kill-${req.user.id}`; // User/session identifier
  const proc = someProcess(); 
  const listener = () => {
     // or whatever you have to kill/destroy/abort the process
    proc.abort()
  }

  try {
    emitter.once(eventName, listener);

    await proc

    // only respond if the process was not aborted
    res.send('process done')
  } catch(e) {
    // Process should reject if aborted
    if(e.code !== 'aborted') {
      // Or whatever status code
      return res.status(504).send('Timeout');
    }
    // process error
    next(e);
  } finally {
    // cleanup
    emitter.removeListener(eventName, listener)
  }
})

app.get('/api/kill-process',(req,res) => {
  //code here
  const eventName = `kill-${req.user.id}`;
  // .emit returns true if the emitter has listener attached
  const killed = emitter.emit(eventName);

  res.send({ killed })
})
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61726124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档