Estoy tratando de fusionar dos matrices por su id (event.id) en una matriz. Me enfrenté a un problema, no entiendo cómo fusionar estos arreglos fuera de sus funciones. Sé que hay una manera de hacerlo usando Promise.all, pero no sé cómo hacerlo. Gracias por tu tiempo.

function getpinnacle() {

  return new Promise(function (resolve, reject) {

    var options = {sportId: 29};
    pinnacle.getFixtures(options, function(err, response, body) {
      if (err) throw new Error(err);
      var pinnFixtures = [];
      body.league.forEach(function(leagues){
        leagues.events.forEach(function(event){ 
          if (event.status == 'O'){
            pinnFixtures.push({
              'id': event.id,
              'homeTeamName': event.home,
              'awayTeamName': event.away
            });
          };    
        });
      });
      resolve(pinnFixtures);
    });

    var options = {sportId: 29, oddsFormat: "DECIMAL"};
    pinnacle.getOdds(options, function(err, response, body) {
      if (err) throw new Error(err);
      var pinnOdds = [];
      body.leagues.forEach(function(league){
        league.events.forEach(function(event){
          event.periods.forEach(function(period){
            if (period.moneyline !== undefined) {
              pinnOdds.push({
                'id': event.id,
                'homeTeamOdds': period.moneyline.home,
                'drawOdds': period.moneyline.draw,
                'awayTeamOdds': period.moneyline.away
              }); 
            };
          });
        });
      });
      resolve(pinnOdds);
    });
  });

}
module.exports = getpinnacle;
1
notapro 30 oct. 2017 a las 21:47

3 respuestas

La mejor respuesta

Para tener un contexto en el que tenga ambas matrices disponibles, puede ajustar cada devolución de llamada en una promesa, y luego usar Promise.all() para esperar los resultados:

function getpinnacle() {
    var options = {sportId: 29};
    const fixtures = new Promise(function(resolve, reject){
      pinnacle.getFixtures(options, function(err, response, body) {
        if (err) throw new Error(err);
        var pinnFixtures = [];
        body.league.forEach(function(leagues){
          leagues.events.forEach(function(event){ 
            if (event.status == 'O'){
              pinnFixtures.push({
                'id': event.id,
                'homeTeamName': event.home,
                'awayTeamName': event.away
              });
            };    
          });
        });
        resolve(pinnFixtures);
      });
    });

    var options = {sportId: 29, oddsFormat: "DECIMAL"};
    const odds = new Promise(function(resolve, reject){
      pinnacle.getOdds(options, function(err, response, body) {
        if (err) throw new Error(err);
        var pinnOdds = [];
        body.leagues.forEach(function(league){
          league.events.forEach(function(event){
            event.periods.forEach(function(period){
              if (period.moneyline !== undefined) {
                pinnOdds.push({
                  'id': event.id,
                  'homeTeamOdds': period.moneyline.home,
                  'drawOdds': period.moneyline.draw,
                  'awayTeamOdds': period.moneyline.away
                }); 
              };
            });
          });
        });
        resolve(pinnOdds);
      });
    });
    return Promise.all([fixtures, odds]);
}

Después de eso, puede llamar a getPinnacle().then(function(results){...}) donde los resultados son una matriz [fixtures, odds].

0
Kraylog 2 nov. 2017 a las 09:22

Puedes usar promise.all como esta

function getpinnacle() {
   var promises = [];
   var fixturePromise = new Promise( (resolve, reject) => {
          ///add your code here and resolve from inside you getFixture method
   });
promises.push(fixturePromise);
var oddPromise = new Promise( (resolve, reject) => {
//add your getOdds method here and resolve this promise too
 });

 promise.push(oddPromise);

 Promise.all(promises).then( (response) => {
 var fixtureResponse = response[0];
var oddResponse = response[1];
//add your extra logic here
});
}
0
Muhammad Zaib 30 oct. 2017 a las 19:07

Lo que haría para refactorizar su código es dividir getFixtures y getOdds en dos funciones separadas, cada una de las cuales devuelve una promesa. Entonces getPinnacle haría return Promise.all(getFixtures(), getOdds())

0
theGleep 30 oct. 2017 a las 19:04