Javascript 如何等待在ExpressJS中解决所有承诺? 背景:

Javascript 如何等待在ExpressJS中解决所有承诺? 背景:,javascript,node.js,express,promise,Javascript,Node.js,Express,Promise,我在ExpressJS中有一个简单的RESTAPI,它允许将多个页面分阶段放在一起。页码是动态的 问题: 由于性能限制,我希望在获取多个web页面时实现异步承诺,等待所有页面完成下载,使用所需的格式对其进行措辞,然后返回到输出 在我研究了promises和async online的所有内容后(因为我对这个异步主题还是新手),他们中的大多数人告诉我使用Promise.all,,但我就是无法让它发挥作用。 导航到GET/xxx 目标产出: 代码 const express=require(“expr

我在ExpressJS中有一个简单的RESTAPI,它允许将多个页面分阶段放在一起。页码是动态的

问题: 由于性能限制,我希望在获取多个web页面时实现异步承诺,等待所有页面完成下载,使用所需的格式对其进行措辞,然后返回到输出

在我研究了promises和async online的所有内容后(因为我对这个异步主题还是新手),他们中的大多数人告诉我使用
Promise.all
,但我就是无法让它发挥作用。

导航到
GET/xxx
目标产出: 代码
const express=require(“express”);
const http=require(“http”);
const fetch=require('node-fetch');
常量app=express();
app.get(“/:username)”,(请求,res)=>{
const username=req.params.username;
让page=3;//将动态获取。但现在,我将在这里放置一个常量
res.json({
用户名:用户名,
parsedHTML:getParsedHTML(用户名,第页),
});
console.log(“已发送页面”)
})
函数getParsedHTML(用户名,第页){
让承诺=[];
让分析=[];
对于(变量i=1;i<(第+1页);i++){
推(取)(`https://example.com/profile/${username}/?page=${i}`)
。然后((c)=>c.text());
//console.log(`Added promise`)
}
承诺。所有(承诺)。然后(()=>{
for(设i=0;i<0.length;i++){
让承诺=承诺[我];
推(分析(承诺));
}
})
收益分析;
}
函数分析(html){
//这里有些东西
//现在它什么也不做
返回html;
}
app.listen(3000,()=>console.log('API侦听端口'+3000+'!'))


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

您正在调用
Promise。
上的所有
都正确地承诺了
,但是
getParsedHTML
函数没有等待该
承诺。所有
都需要在返回前调用以解决。因此,您的
res.json
将立即同步运行,并且返回的
分析是一个空数组

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

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

您的第一个代码块正在调用
analysis(promise)
。那看起来确实不对。您希望在
Promise.all()
之后处理已解决的结果,而不是仍然遵守承诺。如果你确实要处理这些承诺,你必须对它们使用
.then()
,才能得到结果。可能需要
Promise.all(promises)。然后(results=>{/*在这里使用results数组*/})
。非常感谢!!这个问题困扰了我几个小时:(你可以通过在主循环中链接
analysis
来进一步清理代码,甚至可以使用一行代码
return Promise.all(Array.from({length:page},({uu,i)=>i+1)。map(i=>fetch(
{username}/?page=${i}
)。然后((c)=>c.text());然后(analysise));
-这是干净的:p
{
    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 + '!'))
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));
}
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")
    });
})