gpt4 book ai didi

javascript - Node Express 中的并行异步路由器

转载 作者:行者123 更新时间:2023-12-03 03:37:15 24 4
gpt4 key购买 nike

我有一个快速服务器,需要为每个请求从多个外部源获取一些数据。这个逻辑被分成多个路由器(有些不是由我管理的)。

这些路由器是完全独立的,因此不需要一个路由器等待另一个路由器。

<小时/>

作为示例,我有以下代码:

const router1 = express.Router();
const router2 = express.Router();
const router3 = express.Router();
const finalRouter = express.Router();

router1.use((req, res, next) => setTimeout(next, 2000));
router2.use((req, res, next) => setTimeout(next, 2000));
router3.use((req, res, next) => setTimeout(next, 2000));

finalRouter.use((req, res, next) => console.log('All done!'));

当我通常在应用程序中使用所有这些路由器时,它将按顺序执行并在 6 秒内打印 All done!

但是为了提高我的页面速度,我想并行执行它们,所以它们都在 2 秒内完成。我怎样才能做到这一点?

最佳答案

这里绝对不需要单独的路由,您可以只有一条路由并使用 Promise.all等待所有请求。如果它们本身不支持 Promise,您可以将它们包装在一个中,例如

router.use(async (req, res, next) => {
await Promise.all([
new Promise((resolve, reject) => {
setTimeout(() => resolve(), 2000);
}),
...
]);
next();
});
router.use((req, res, next) => {
console.log('All done!');
});
<小时/>

根据评论中的讨论,如果您没有能力将路由合并为一个 - 那很好,而且并不重要。进一步考虑这一点,您真正需要的只是一个包装器来捕获“真正的”中间件,将其添加到队列中,然后转到下一个。为此,您至少需要访问设置路由的代码(看起来有),例如

queue.js

module.exports = route => {
return (req, res, next) => {
// ensure we've got a queue
if (!(req.queue instanceof Array)) {
req.queue = [];
}
// queue the blocking route
req.queue.push(new Promise((resolve, reject) => {
// run real route, signal success or failure when done
route(req, res, err => err ? reject(err) : resolve());
});
next(); // move on, don't wait
};
}

然后在你的 route

const queue = require('./queue');
...
router.use(queue((req, res, next) => setTimeout(() => next(), 2000))));
router.use(queue((req, res, next) => setTimeout(() => next(), 2000))));
router.use(queue((req, res, next) => setTimeout(() => next(), 2000))));
router.use(async (req, res, next) => {
await Promise.all(req.queue);
console.log('All done!');
}

关于javascript - Node Express 中的并行异步路由器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45799642/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com