David Trinh
David Trinh

Reputation: 329

issue with pushing data into a new array while in a promise chain

I'm having trouble figuring out why my data is not being push into my new array, "results". newArr[0].mscd.g[i] is a list of several objects.

var axios = require('axios');
var moment = require('moment');
var _ = require('lodash');

var getData = function() {
  return getNBASchedule().then(function(payload) {
      return filterByMonth('January', payload);
  }).then(function(result) {
      return result
  });
}
....

getData grabs the data from baseURL and returns a list of objects.

var getMonthlySchedule = function(data){
  var results = [];
  var newArr = data.slice(0, data.length);
  for (var i = 0; i <= newArr[0].mscd.g.length; i++) {
    if (newArr[0].mscd.g[i].v.tid === 1610612744 || newArr[0].mscd.g[i].h.tid === 1610612744) {
      results.push(newArr[0].mscd.g[i]); <---- //does not seem to work
      // however if I were to console.log(newArr[0].mscd.g[i], 
      // I would see the list of objects)
    }
  }
  return results; <-- //when i console at this point here, it is blank
};

var getSchedule = function () {
  return getData().then(function(pl) {
    return getMonthlySchedule(pl)
  })
};

var monthlyResults = function() {
  return getSchedule().then(function(r) {
    console.log("result", r)
    return r
  });
};

monthlyResults();

Upvotes: 0

Views: 89

Answers (2)

Roamer-1888
Roamer-1888

Reputation: 19288

Your code should simplify as follows :

var getData = function() {
    return getNBASchedule().then(function(payload) {
        return filterByMonth('January', payload);
    });
}

var getMonthlySchedule = function(data) {
    return data[0].mscd.g.filter(function(item) {
        return item.v.tid === 1610612744 || item.h.tid === 1610612744;
    });
};

var monthlyResults = function() {
    return getData()
    .then(getMonthlySchedule)
    .then(function(r) {
        console.log('result', r);
        return r;
    });
};

monthlyResults();

This may fix the problem. If not, then :

  • Check the filter test. Maybe those .tid properties are String, not Number?
  • Check that data[0].mscd.g is the right thing to filter.

Upvotes: 1

jfriend00
jfriend00

Reputation: 707806

You don't know when getSchedule() is done unless you use a .then() handler on it.

getSchedule().then(function(data) {
    // in here results are valid

});
// here results are not yet valid

You are probably trying to look at your higher scoped results BEFORE the async operation has finished. You HAVE to use .then() so you know when the operation is done and the data is valid.

Upvotes: 1

Related Questions