【发布时间】:2019-01-12 21:27:11
【问题描述】:
背景:
我在 ExpressJS 中有一个简单的 REST API,它允许将多个页面分阶段处理在一起。页码是动态的。
问题:
由于性能限制,我想在获取多个网页时实现异步承诺,等待所有网页完成下载,用我想要的格式对其进行表述,然后返回输出。
在我在线研究了所有关于 Promise 和 async 的内容之后(因为我对这个 async 主题还很陌生),他们中的大多数人告诉我使用Promise.all,但我就是无法做到以某种方式工作。
导航到GET /xxx时的当前输出
{
username: xxx
parsedHTML: []
}
目标输出:
{
username: xxx
parsedHTML: [
"BUNCH OF ANALYSED HTML",
"BUNCH OF ANALYSED HTML",
"BUNCH OF ANALYSED HTML",
...
]
}
代码
const express = require("express");
const http = require("http");
const fetch = require('node-fetch');
const app = express();
app.get("/:username", (req, res)=>{
const username = req.params.username;
let page = 3; //Will be obtained dynamically. But for now, I'll put a constant here
res.json({
username: username,
parsedHTML: getParsedHTML(username, page),
});
console.log("Page sent")
})
function getParsedHTML(username, page) {
let promises = [];
let analyses = [];
for (var i = 1; i < (page + 1); i++) {
promises.push(fetch(`https://example.com/profile/${username}/?page=${i}`)
.then((c) => c.text()));
// console.log(`Added promise`)
}
Promise.all(promises).then(()=>{
for (let i = 0; i < promises.length; i++) {
let promise = promises[i];
analyses.push(analyse(promise));
}
})
return analyses;
}
function analyse(html){
// Some synchronous analyse stuff here
// Right now it do nothing
return html;
}
app.listen(3000, () => console.log('API listening on port ' + 3000 + '!'))
任何帮助将不胜感激。非常感谢。
【问题讨论】:
标签: javascript node.js express promise