gpt4 book ai didi

javascript - 如何等待所有 Promise 在 ExpressJS 中解决?

转载 作者:行者123 更新时间:2023-11-30 11:15:39 25 4
gpt4 key购买 nike

背景:

我在 ExpressJS 中有一个简单的 REST API,它允许同时分阶段处理多个页面。页码是动态的。

问题:

由于性能限制,我想在获取多个网页时实现异步 promise ,等待所有网页完成下载,用我想要的格式来表达它们,然后返回输出。

在我研究了所有关于 promises 和在线异步的东西之后(因为我对这个异步主题还是新手),他们中的大多数人告诉我使用 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 + '!'))

任何帮助将不胜感激。非常感谢。

最佳答案

您在 promise 上正确调用了 Promise.all,但是 getParsedHTML 函数没有等待 对于 Promise.all 调用在返回之前解决。因此,您的 res.json 正在立即、同步 运行,并且返回的 analyses 是一个空数组。

改为返回 Promise.all 调用,并确保分析 响应(来自 Promise.all调用)而不是 promise :

return Promise.all(promises).then((responses)=>{
for (let i = 0; i < responses.length; i++) {
let response = responses[i];
analyses.push(analyse(response));
}
}).then(() => analyses);

但是您可以通过映射结果响应数组来显着清理代码:

function getParsedHTML(username, page) {
let promises = [];
for (var i = 1; i < (page + 1); i++) {
promises.push(fetch(`https://example.com/profile/${username}/?page=${i}`)
.then((c) => c.text()));
}
return Promise.all(promises)
.then((responses) => responses.map(analyse));
}

还要确保在发送 res.json 之前等待 getParsedHTML 等待返回的 Promises 解析:

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
getParsedHTML(username, page)
.then((parsedHTML) => {
res.json({
username,
parsedHTML
});
console.log("Page sent")
});
})

关于javascript - 如何等待所有 Promise 在 ExpressJS 中解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51698828/

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