получение данных из http.get и передача их объекту - PullRequest
0 голосов

, когда я запускаю этот код, я получаю свой массив описаний, полный данных

 onGetDescs(descipline:string){
    let rep  =this.http.get("http://data");
    let result: any;
    rep.subscribe( data => {
      this.desciplines = data as Descipline[];
        result =  this.desciplines.filter(function(d) {
        return d.name === descipline;
      });
      this.desciplines = result as Descipline[];
      console.log(this.desciplines);
    });  

    
     return this.desciplines;
  }

, но когда я запускаю, я хочу работать с ним или просто сделать это

  onGetDescs(descipline:string){
    let rep  =this.http.get("http://45.80.149.82:8080/ctp-api/api/disciplines");
    let result: any;
    rep.subscribe( data => {
      this.desciplines = data as Descipline[];
      result =  this.desciplines.filter(function(d) {
      return d.nom === descipline;
      });
      this.desciplines = result as Descipline[];
    });  

    console.log(this.desciplines);

     return this.desciplines;
  }

i получить пустой массив

мне действительно нужно знать, что происходит ps: я новичок в angular

Ответы [ 2 ]

1 голос
/ 10 июля 2020

В первом примере вы печатаете данные после того, как вызов api отправляет данные обратно. (После операции asyn c)

Но во втором случае вы печатаете данные сразу после вызова api. На этом этапе api не отправил обратно данные, и у вас будет пустой массив.

Насколько я помню, содержимое js выполняется в одном потоке (счастлив быть неправым), поэтому ответ API (выполнение содержимого внутри .subscribe(...)) произойдет после выполнения onGetDescs.

1 голос
/ 10 июля 2020

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

Вы должны знать, что функция, которую вы передаете методу подписки будет выполняться после загрузки данных, но не блокирует выполнение , поэтому после запуска rep.subscribe (...) практически сразу выполняется следующий оператор (return this.desciplines;), не давая достаточно времени для загрузки массива перед возвратом.

Здесь вам нужно переосмыслить свой лог c, чтобы желаемое поведение, которого вы хотите достичь с данными дисциплины, попало внутрь метод подписки.

...