使用本机节点承诺。这是我的代码:
(req, res) =>
requestp('https://swapi.co/api/planets')
.then((planets) => Promise.all(planets.results.map(planet => {
var residents = planet.residents.map(requestp(r))
return {
planetName: planet.name,
residents: Promise.all(residents).then((r) => r.name)
}
}))
.then((planets) => res.json(planets.map(p => {
let obj = {}
return res.json(obj[p.planetName] = p.residents);
}))))
.catch((err) => res.status(400).send(err))
我正在尝试返回一个看起来像这样的对象数组:
{ Alderaan: ["nameofResident1","nameofResident2"]}
我似乎陷入了planet.residents.map()
部分代码中。
任何帮助都将不胜感激。
答案 0 :(得分:0)
如果将内部工作分解为某些功能,不仅可以使编写更容易,而且更容易阅读
在下文中,为了使其可执行,我调用了主函数doit
-
我还添加了requestp
函数,该函数使用fetch
- 所以除非您使用现代浏览器(此处不允许使用Internet Explorer),否则该代码段无法使用
运行代码段,您应该会看到您要查找的结果
// you wont need this function
var requestp = (url) => fetch(url).then(response=>response.json());
// code starts here
var getResidentName = (url) => requestp(url).then((resident) => resident.name);
var getAllResidentNames = (residents) => Promise.all(residents.map(r => getResidentName(r)));
var processPlanet = (planet) => getAllResidentNames(planet.residents).then((residents) => ({[planet.name]: residents}));
var processPlanets = (planets) => Promise.all(planets.results.map(planet => processPlanet(planet)));
// slight change so it can run in the snippet, ignore the var doit = for your code
var doit = (req, res) =>
requestp('https://swapi.co/api/planets')
.then(processPlanets)
.catch((err) => res.status(400).send(err));
// doit and log the result as a JSON string
doit().then(result => console.log(JSON.stringify(result)));

您可以编写上面使用的代码
(req, res) => {
var getResidentName = (url) => requestp(url).then((resident) => resident.name);
var getAllResidentNames = (residents) => Promise.all(residents.map(r => getResidentName(r)));
var processPlanet = (planet) => getAllResidentNames(planet.residents).then((residents) => ({[planet.name]: residents}));
var processPlanets = (planets) => Promise.all(planets.results.map(planet => processPlanet(planet)));
return requestp('https://swapi.co/api/planets')
.then(processPlanets)
.catch((err) => res.status(400).send(err));
}
这样所有"支持"函数不会污染全局命名空间
使用它之后,如果必须的话,您可以很容易地将代码重构为一个整体块