承诺所有并获得请求

时间:2018-03-03 22:41:42

标签: javascript node.js express promise

所以我很难理解完成任务所需采取的步骤。我希望所有用户都能获得加密硬币的“关注列表”(我已经完成了)。然后根据他们的监视列表中保存的内容,从coinmarketcap api返回更新的数据。有人告诉我,我可以使用Promise.all()有效地完成这项工作。我是否主要从mongodb监视列表中找到/映射硬币的id('bitcoin')然后运行get coins函数并将映射的id作为硬币参数?任何人都可以就此提供一些指导吗?

我试图做这样的事情,但那不起作用。这表示undefined不是一个函数。

CryptoWatchlist.find()
.then(watchlists => watchlists.map(watchlist => watchlist.id))
.then(id => Promise.all(getCoins(id)))

/router/watchlist.js

router.get('/watchlist', (req, res) => {
  CryptoWatchlist.find()
    .then(watchlists =>
      res.json(watchlists.map(watchlist => watchlist.serialize()))
    )
    .catch(err => {
      console.error(err);
      res.status(500).json({ message: 'Internal server error' });
    });
});

/api.js

const fetch = require('node-fetch');

function getCoins(coin) {
  return fetch(`https://api.coinmarketcap.com/v1/ticker/${coin}`).then(
    response => {
      return response.json();
    }
  );
}

module.exports = getCoins;

3 个答案:

答案 0 :(得分:0)

在结果数组中使用Promise.all:

const promises = CryptoWatchlist.find()
  .then(watchlists => watchlists.map(watchlist => watchlist.id))
  .then(id => getCoins(id))

Promise.all(promises)
  .then(data => {
    console.log(data)
  })

答案 1 :(得分:0)

你离得太远了。这应该让你走上正轨:

0

const watchlistPromises = CryptoWatchlist.find() .then(watchlists => watchlists.map(({ id }) => getCoins(id)); Promise.all(watchlistPromises).then(responses => { // Process responses }); 将是一个getCoin promise响应数组,其顺序与watchlist数组的顺序相同。

我们的想法是将您的列表中的每个硬币映射到coinmarketcap API的请求。如果您的列表很大,那么您将很难使用他们的API。您可能想看看他们的API是否有选项可以在一个请求中发送多个符号。

答案 2 :(得分:0)

替代其他答案,但更像是原始代码的FP风格

CryptoWatchlist.find()
.then(watchlists => 
    Promise.all(watchlists.map(({id}) => 
        getCoins(id)
    ))
)