Сохранить данные из подписки Javascript - PullRequest
0 голосов
/ 13 января 2020

Я новичок в этом. Я хочу получить данные из Rest API. Загрузка данных из конечной точки в порядке, но я хочу использовать ее позже, вне метода. Например, я хочу суммировать один из атрибутов задач в другой функции. В функции loadTodos () первый консольный журнал отображает данные, а второй - только «неопределенный». Как я могу сохранить значения, которые loadTodos () возвращает, и использовать их позже?

import { Component, OnInit } from '@angular/core';
import { Router } from '@angular/router';

import { TodoDomainService } from '../services/todo-domain.service';
import { Todo } from 'app/model/todo';

@Component({
  selector: 'app-todo-listing',
  templateUrl: './todo-listing.component.html',
  styleUrls: ['./todo-listing.component.scss']
})
export class TodoListingComponent implements OnInit {
  todo: Todo;

  constructor(private todoService: TodoDomainService, private router:Router) { }

  public todos;
  
  ngOnInit() {
    this.loadTodos();
    this.todo = new Todo();
  }

  private loadTodos() {
    this.todoService.getTodos().subscribe(
      data => { this.todos = data },
      err => console.error(err),
      () => console.log("todos loaded." +this.todos)
    );
   console.log(this.todos)
  }
 }

private getSum(todos) {
    var sum = 0;
    for(var i = 0; i < todos.length; i++){
    sum += todos.price[i]}
return this.aggregatedSales;
  }

1 Ответ

0 голосов
/ 13 января 2020

console.log("todos loaded." +this.todos) покажет ответ, потому что он выполняется после того, как наблюдаемое завершено.

console.log(this.todos) после того, как .subscribe(...) показывает undefined, потому что наблюдаемое еще не завершено, то есть строка data => { this.todos = data } не была выполнена.

Вы правильно сохраняете данные для использования. Если вы обновите свой следующий вызов для подписки, чтобы он выглядел следующим образом, тогда сумма будет выполнена:

// from
data => { this.todos = data }

// to
data => {
  this.todos = data;
  this.getSum(this.todos);
}

Вот пример stackblitz получения массива todos и сложения userId значений в переменную sum с последующим отображением значения.

...