Return value from the promise

is possible to return a value from the promise?

i have these functions

  get_categories() {

    this.categories_count = 0;
    this.getCategories.get_categories(1)
      .then(data => {
        console.log(data);
        this.items = data.results;

        for (var i = 0; i < this.items.length; i++) {
          this.categories_count = this.get_categories_count(this.items[i].name);
          this.categories_list.push(this.items[i]);
          console.log(this.categories_count);
        }

      });

  }


  get_categories_count(category) {

    this.getFacebookEvents.get_events(1)
      .then(data => {
        this.items = data;
        this.categories_count = this.insert_data(this.items, category);
        return this.categories_count;
      });
  }



  insert_data(items, category) {


    var count = 0;

    for (var i = 0; i < this.items.length; i++) {


      var start_year = parseInt(this.items[i].data_inizio.substring(6, 10))
      var start_month = parseInt(this.items[i].data_inizio.substring(3, 5))
      var start_day = parseInt(this.items[i].data_inizio.substring(0, 2))
      var start_hours = parseInt(this.items[i].ora_inizio.substring(0, 2))
      var start_minutes = parseInt(this.items[i].ora_inizio.substring(3, 5))

      var end_year = parseInt(this.items[i].data_fine.substring(6, 10))
      var end_month = parseInt(this.items[i].data_fine.substring(3, 5))
      var end_day = parseInt(this.items[i].data_fine.substring(0, 2))
      var end_hours = parseInt(this.items[i].ora_fine.substring(0, 2))
      var end_minutes = parseInt(this.items[i].ora_fine.substring(3, 5))




      var date = new Date();

      var today_year = date.getFullYear();
      var today_month = date.getMonth();
      var today_day = date.getDate();

      var start_date = new Date(Date.UTC(start_year, start_month - 1, start_day, start_hours, start_minutes))
      var end_date = new Date(Date.UTC(end_year, end_month - 1, end_day, end_hours, end_minutes))
      var today_date = new Date();

      var start = new Date(Date.UTC(start_year, start_month - 1, start_day));
      var end = new Date(Date.UTC(start_year, start_month - 1, start_day));
      var today = new Date(today_year, today_month, today_day)

      var week = new Date(date.setDate(date.getDate() + 7))
      var month = new Date(date.setDate(date.getDate() + 30))

      if (today <= start && this.items[i].category == category) {
        count++
      }


    }

    return count;

  }

is possible to get the value of this function get_categories_count(category) ???

now is set to undefined

Thank you|

something like this.

get_categories_count(category) {
return new Promise((resolve) => {

this.getFacebookEvents.get_events(1)
  .then(data => {
    this.items = data;
    this.categories_count = this.insert_data(this.items, category);
    resolve(this.categories_count);
  });

}
})

Thank you now i have this value
image
How i can get this value?

I need the count value in _zone_symbol_value:

i edit my function with your function

  get_categories_count(category) {
    return new Promise((resolve) => {
      this.getFacebookEvents.get_events(1)
        .then(data => {
          this.items = data;
          this.categories_count = this.insert_data(this.items, category);
          resolve(this.categories_count);
        });
    });
  }

i have other problem :frowning:

if i want to add a fields in my array isn’t possible in then data promise.

any solution?

example this.items[i].try = “PROVA” doesn’t found in my array categories list

   get_categories() {

    this.categories_count = 0;
    this.getCategories.get_categories(1)
      .then(data => {
        console.log(data);
        this.items = data.results;

        for (var i = 0; i < this.items.length; i++) {
          this.get_categories_count(this.items[i].name).then(data => {
            this.items[i].try = "PROVA";
          });

          this.categories_list.push(this.items[i]);
        }
        console.log(this.categories_list);


      });
  }

Part of the reason your code is hard to debug is that you are writing in antipatterns. I suggest you define your Promises in TypeScript. Read this:

https://basarat.gitbooks.io/typescript/docs/promise.html

Toward the end, it talks about Promise.all() which may help you with your array question.

Also, your code nests thens inside of thens. That’s extremely hard to debug if anything goes wrong because you have asynchrony inside of asynchrony. It’s ok to chain a then after a then, and maybe that will work in your situation.

Don’t do: .then(.then ... )

Ok to do: .then().then()

Thank you for your clarify :slight_smile:

I resolve

 get_categories() {
    this.getCategories.get_categories(1)
      .then(data => {
        this.array = data.results;
        for (var i = 0; i < this.array.length; i++) {
          this.categories_list.push(this.array[i]);
        }
        return this.set_categories(this.categories_list, this.array);
      });
  }

  get_facebook_events() {
    this.getFacebookEvents.get_events(1)
      .then(data => {
        this.items = data;
        return this.set_events(this.items);
      });
  }


  set_categories(category, item) {
    this.categories_list = category;

  }

  set_events(items) {
    this.facebook_events = items;
    this.category_counter();
  }


  category_counter() {
    for (var i = 0; i < this.categories_list.length; i++) {
      this.categories_list[i].countevents = this.insert_data(this.facebook_events, this.categories_list[i].name)
    }
    console.log(this.categories_list);
  }

  insert_data(items, category) {

    var count = 0;

    for (var i = 0; i < this.items.length; i++) {


      var start_year = parseInt(this.items[i].data_inizio.substring(6, 10))
      var start_month = parseInt(this.items[i].data_inizio.substring(3, 5))
      var start_day = parseInt(this.items[i].data_inizio.substring(0, 2))
      var start_hours = parseInt(this.items[i].ora_inizio.substring(0, 2))
      var start_minutes = parseInt(this.items[i].ora_inizio.substring(3, 5))

      var end_year = parseInt(this.items[i].data_fine.substring(6, 10))
      var end_month = parseInt(this.items[i].data_fine.substring(3, 5))
      var end_day = parseInt(this.items[i].data_fine.substring(0, 2))
      var end_hours = parseInt(this.items[i].ora_fine.substring(0, 2))
      var end_minutes = parseInt(this.items[i].ora_fine.substring(3, 5))




      var date = new Date();

      var today_year = date.getFullYear();
      var today_month = date.getMonth();
      var today_day = date.getDate();

      var start_date = new Date(Date.UTC(start_year, start_month - 1, start_day, start_hours, start_minutes))
      var end_date = new Date(Date.UTC(end_year, end_month - 1, end_day, end_hours, end_minutes))
      var today_date = new Date();

      var start = new Date(Date.UTC(start_year, start_month - 1, start_day));
      var end = new Date(Date.UTC(start_year, start_month - 1, start_day));
      var today = new Date(today_year, today_month, today_day)

      var week = new Date(date.setDate(date.getDate() + 7))
      var month = new Date(date.setDate(date.getDate() + 30))

      if (today <= start && this.items[i].category == category) {
        count++
      }


    }

    return count;

  }

Instead of all that gnarly homebrew date parsing, how about using date-fns?

1 Like

thank you @rapropos for your suggestion.

now to manipulate the date is very simple :slight_smile:

Apologies to @filippodicostanzo for the hijack, but @rapropos I though I’d seen you recommend moment.js to someone else in the past. I might be crossing wires, but if I remember correctly: Is date-fns better, or better for this particular case? I haven’t used either.

I have recently changed my mind, and now recommend date-fns. It is lighter, and moment caused all sorts of problems with lazy loading in app-scripts #848.

2 Likes