@awaitjs/express 怎么能够在 res.json()后继续完成一个长时间的任务

2019-03-22 00:00:32 +08:00
 qwertyegg

我看到别人的提问里面

var express = require('express');
var app = express();

app.get('/some/route', (req, res)=> {
  res.json({success: false, message: "End time must be AFTER start time"});
  console.log('Hi')
});

这个 console.log('Hi')会被执行。现在我有一个需求,要用 @awaitjs/express 来 decorate express,代码大概如下

const express = require('express');
const { decorateApp } = require('@awaitjs/express');
const app = decorateApp(express());
const port = 3000;

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

app.getAsync('/toggle', async function(req, res){
        let period = parseInt(req.query.period);
        let count = parseInt(req.query.count);
        
        res.json({success: true, message: "Power cycle schedueled successfuly for the interval of " + req.query.period + " minute(s), totaling " + req.query.count + " times."});
        while(count-- > 0){           
               await do_something();
        }
        
        
    });
await app.listen(port, () => console.log(`Example app listening on port ${port}!`))

这个 res.json 后面的 while loop 是一个长时间执行的代码。我期望的是如前面第一个例子那样,在 res.json 返回客户端一个结果后继续执行 while loop。但是实际上这个 while loop 并不会运行,我哪里做的不对?

3318 次点击
所在节点    Node.js
1 条回复
Hanggi
2019-08-09 13:06:38 +08:00
不太建议你用这个 awaitjs/express,感觉实现不是很好。
你这个程序,后面用 while await,那么这个长时间任务没做完之前,这个 api 应该不会返回,就挂在那里,直到做完。
是这样吗?
如果是的,那你这么实现就不对了,你应该是要这个接口返回成功,然后程序还在跑。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/547227

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX