被困在Promise里面

时间:2016-12-03 19:32:51

标签: node.js dictionary 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 个答案:

答案 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));
}

这样所有"支持"函数不会污染全局命名空间

使用它之后,如果必须的话,您可以很容易地将代码重构为一个整体块