嵌套的Promise没有推送到数组

时间:2017-07-15 11:18:21

标签: javascript arrays express es6-promise request-promise

我在Express API上有一条路线,要求艺术家提供详细信息,此回复包含该艺术家的一系列版本。

目前,我想要映射该数组,提取网址,然后对该网址进行API调用。我回复的反应,我认为我需要推入一个数组,以便最终可以返回该数组作为我的响应。 (这是前端的后端)

然而,当我控制日志我的数组时,它是空的。

我在npm上使用了请求承诺库。

这是对的吗?我认为我需要以某种方式确保所有承诺在我执行之前得到解决,但我不确定如何?

route.get('/search', (req, res) => {
    const artist = req.query.artist || '';
    let releases = [];

    rp.get(`https://api.discogs.com/database/search?artist=${artist}&type=release&format=Vinyl&per_page=5&page=1`)
        .then(({results}) => results.map(({resource_url}) => resource_url))
        .then((resource_urls) => resource_urls.map((resource_url) => rp.get(resource_url).then((release) => releases.push(release))))
        .then(() => console.log(releases))
        .catch((err) => console.log(err))
});

1 个答案:

答案 0 :(得分:0)

您可以在链中使用Promise.all,而不使用之前声明的releases变量:

route.get('/search', (req, res) => {
    const artist = req.query.artist || '';

    rp.get(`https://api.discogs.com/database/search?artist=${artist}&type=release&format=Vinyl&per_page=5&page=1`)
        .then(({results}) => results.map(({resource_url}) => resource_url))
        .then((resource_urls) => Promise.all(resource_urls.map((resource_url) => rp.get(resource_url)))
        .then((releases) => console.log(releases))
        .catch((err) => console.log(err))
});