Así que tengo dificultades para comprender los pasos que debo seguir para cumplir mi tarea. Quiero obtener todas las "listas de observación" de los usuarios para las monedas criptográficas (que he hecho). Luego, devuelva los datos actualizados de la API de coinmarketcap dependiendo de lo que esté guardado en su lista de observación. Me dijeron que puedo lograr esto de manera eficiente usando Promise.all (). ¿Esencialmente estaría buscando / mapeando la identificación de la moneda ('bitcoin') de la lista de observación de mongodb y luego ejecutando la función de obtención de monedas con la identificación asignada como parámetro de moneda? ¿Alguien puede proporcionar alguna orientación sobre esto?

Traté de hacer algo como esto, pero eso no funcionó. Eso dice que indefinido no es una función.

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
jpatel701 4 mar. 2018 a las 01:41

3 respuestas

La mejor respuesta

No estás muy lejos. Esto debería llevarte por el camino correcto:

const watchlistPromises = CryptoWatchlist.find()
.then(watchlists => watchlists.map(({ id }) => getCoins(id));

Promise.all(watchlistPromises).then(responses => {
    // Process responses
});

responses será una matriz de respuestas prometedoras de getCoin que están en el mismo orden que la matriz de la lista de observación.

La idea es mapear cada una de las monedas en su lista con una solicitud a la API de coinmarketcap. Si su lista es grande, estará golpeando su API con fuerza. Es posible que desee ver si su API tiene una opción para enviar varios símbolos en una solicitud.

0
Andy Gaskell 3 mar. 2018 a las 22:54

Alternativa a las otras respuestas, pero más estilo FP como el código original

CryptoWatchlist.find()
.then(watchlists => 
    Promise.all(watchlists.map(({id}) => 
        getCoins(id)
    ))
)
0
Jaromanda X 3 mar. 2018 a las 23:10

Use Promise.all en el conjunto resultante de promesas:

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

Promise.all(promises)
  .then(data => {
    console.log(data)
  })
0
dfsq 3 mar. 2018 a las 22:53