Вызов переменной возвращает значение «undefined» вне функции подписчика. - PullRequest
0 голосов
/ 17 марта 2020

Подобный вопрос был задан ранее и получил довольно много ответов, и я мог бы показаться кому-то повторяющимся, но просто мне остро нужен третий глаз. Я присваиваю значение переменной внутри функции подписчика в angular, но эта переменная возвращает 'undefined' при вызове вне функции Subscribe. Вот что я делаю:

    this.invoiceService.buildDataForDiscountGraph(this.usrId, this.currentYear)
      .subscribe( response => {
        this.discountsGraphData += response;
        //this.discountGraphData is of type 'string'
    });
This.discountsGraphData

возвращает нужное значение при вызове внутри подписчика, но вне подписчика, в другой функции, и даже в моем шаблоне это пустая строка.

Это выглядит как функция buildDataForDiscountGraph ():

buildDataForDiscountGraph(u,y){
    return this.getUserInvoices(u)
      .pipe(
        map(response  => {
          if(Object.keys(response).length > 0)
          {
            let jan = 0, feb = 0, mar = 0, apr = 0;
            let may = 0, june = 0, july = 0, aug = 0;
            let sep = 0, oct = 0, nov = 0, dec = 0;

            for(let x = 0; x < Object.keys(response).length; x++) {
              let dateSplit = response[x]['datecreated'].split('-');
              let year = dateSplit[0];
              let month = dateSplit[1];

              if(y == year){
                if(month == '01')jan += response[x]['discount'];
                if(month == '02')feb += response[x]['discount'];
                if(month == '03')mar += response[x]['discount'];
                if(month == '04')apr += response[x]['discount'];
                if(month == '05')may += response[x]['discount'];
                if(month == '06')june += response[x]['discount'];
                if(month == '07')july += response[x]['discount'];
                if(month == '08')aug += response[x]['discount'];
                if(month == '09')sep += response[x]['discount'];
                if(month == '10')oct += response[x]['discount'];
                if(month == '11')nov += response[x]['discount'];
                if(month == '12')dec += response[x]['discount'];
              }
            }

            return [
              jan, feb, mar, apr, may, june, july, aug,
              sep, oct, nov, dec
            ].join();
          }  
      })
    )
  }

Мне пришлось переместить код в свой сервис, чтобы выяснить, что его вызывает. Сервисная функция getUserInvoices () вызывает конечную точку следующим образом:

/**
   * Get Invoices
   *
   * @param userId
   * @param Limit
   * @param Offset
   */
  getUserInvoices(usrId, limit?, offset?){
    return this.http.get(this.apiEndPoint + usrId + '/invoices?limit=' + limit + '&offset=' + offset)
      .pipe(
        map( data =>
          {
            return (data ? data : []);
          }
        )
      )
  }

1 Ответ

0 голосов
/ 18 марта 2020

Вы можете установить this.discountGraphData вне подписчика, используя функцию

this.invoiceService.buildDataForDiscountGraph(this.usrId, this.currentYear)
  .subscribe( response => {
      this.setDate(response);
    //this.discountsGraphData += response;
    //this.discountGraphData is of type 'string'
});

setDate(data){
    this.discountsGraphData = data;
    console.log(this.discountsGraphData);  --> you will get value here.
}
...