Застрял внутри Promise
Использование нативных обещаний узлов. Вот мой код:
(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()
хотя часть моего кода
Любая помощь будет оценена.
1 ответ
Если вы разбиваете внутреннюю работу на некоторые функции, это не только облегчает написание, но и облегчает чтение
Чтобы сделать его исполняемым, я вызвал функцию main 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));
}
Таким образом, все "вспомогательные" функции не загрязняют глобальное пространство имен.
После того, как у вас все получится, вы можете, если нужно, достаточно легко преобразовать код в один монолитный блок.