Застрял внутри 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));
}

Таким образом, все "вспомогательные" функции не загрязняют глобальное пространство имен.

После того, как у вас все получится, вы можете, если нужно, достаточно легко преобразовать код в один монолитный блок.

Другие вопросы по тегам