2017-07-15 96 views
1

我有一個快速API的路由,請求藝術家的詳細信息,此響應包含該藝術家的一系列發佈。嵌套承諾不推向陣列

目前我想映射到該數組,提取一個URL,然後對該URL進行API調用。我回來的迴應,我想我需要推入一個數組,因此該數組最終可以作爲我的迴應返回。 (這是前端的後端)

但是,當我控制檯登錄我的數組時,它是空的。

我在npm上使用了request-promise庫。

這是正確的嗎?我想我需要以某種方式確保所有的承諾在我執行之前解決,但是我不確定如何?

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

回答

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)) 
}); 
+1

謝謝你,這麼多,謝謝大家。 – pgGriff