【发布时间】:2021-09-04 00:03:23
【问题描述】:
我正在使用功能有限的 API,并且我正在尝试组合对多个路由的多个调用,以基于单个关键字搜索为用户提供特定信息。这会在 for 循环中创建许多单独的请求,这些请求本身就在其他请求结果的回调中,等等。最后,我无法等待所有嵌套请求完成,直到我解决了原始 Promise 和我的模板引擎呈现页面并响应用户获取请求。因此,模板引擎正在渲染一个结果数组仍然为空的页面。
let discoveredMovies = [];
let personSearchCast = new Promise ((resolve) => {
request(UserSearchParamsURL1, {json:true}, (err, res, body) =>{
if (err) {
console.log(err);
resolve();
}
else if(!body.results.length || !body) {
resolve();
}
else {
for (const person of body) {
request(URL2, {json: true}, (err, res2, body2) => {
for (const movie of body2) {
request(URL3, {json:true}, (err, res3, body3) => {
movie[CertainParam] = false;
if (Certain Conditions) {
discoveredMovies.push(movie);
}
if (Other Conditions) {
discoveredMovies.push(movie);
}
if(More Conditions) {
movie[CertainParam] = true;
Object.assign(movie, {body3info: body3});
}
resolve();
});
};
});
};
}
});
});
personSearchCast.then(() => {
res.render("partials/foundpeoplemovies.ejs", {movies: discoveredMovies});
});
就目前而言,我知道所有的请求调用都会发生,因为我可以将它们注销,但是模板会在它们完成之前呈现。我已经尝试创建几个异步等待函数并尝试连接它们,但我无法理解它。我还尝试使用计数器来调节 resolve(),直到循环中的所有循环都完成,但这也没有让我走得太远。
我知道代码很乱,但是有什么想法可以干净利落地做我想做的事吗?否则我将不得不弄乱用户界面并为用户添加一系列间歇性步骤,而不是在一次快速搜索中为用户提供所有信息。
【问题讨论】:
-
你甚至没有在这里嵌套 Promise,你在嵌套
request的异步回调。单独承诺该功能,然后仅使用承诺版本 -then,Promise.all,async/await将很容易工作。 -
The
requestmodule 已弃用。你不应该使用它。 (切换到默认使用 Promise 的模块会更容易使用async和await) -
感谢两位。我仍在使用异步函数。我也从 request 模块切换到 request-promise 模块。
标签: javascript node.js express promise request