Угловая подписка на данные для наблюдаемых возвратов не определена

#javascript #angular #typescript #observable #subscribe

Вопрос:

Я работаю над Угловым проектом. но у меня проблема, когда я подписываю данные на observable, возвращается неопределенное

и у меня есть метод службы, который возвращает данные из HTTP.

 public serviceMethod(): Observablelt;WordList[]gt; { const url = `${this.baseUrl}/wordLists`;   return this.httpClient.getlt;GetResponseWordListgt;(url).pipe(  map(response =gt; response._embedded.wordLists)   ); }  

и компонентный метод, который берет данные из службы и присваивает их «массиву».

 componentMethod() {   // get from the service  this.otherService.serviceMethod().subscribe(  data =gt; {  this.array = data;    }  );  }  

У меня есть другой метод в том же файле, который использует «массив».

 secondMethod(){  console.log(this.array) }  

Наконец, у меня есть основной метод, который использует оба последних двух метода.

 mainMethodMethod(){  componentMethod();  secondMethod(); }  

сначала запускается метод componentMethod (). Однако всегда получайте «неопределенное» значение массива

одним из решений является размещение функции secondMethod() внутри функции componentMethod() при подписке на данные. Но я не хочу этого делать, потому что мне нужно использовать цикл, а это займет слишком много времени.

Комментарии:

1. Вы должны звонить secondMethod() асинхронно. Это означает, что complete обработчик subscribe() внутри componentMethod() или должен componentMethod() возвращать что-то асинхронное (обещание или наблюдаемое).

2. 1. сделайте консоль. войдите непосредственно в службу и проверьте, возвращаете ли вы данные. (здесь ответ._embedded.Списки слов) 2. откройте вкладку сеть, проверьте запрос

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

Ответ №1:

Вы должны вызвать свой второй метод в функции подписки после переменной данных.

Он становится неопределенным, так как он асинхронный, он должен дождаться завершения загрузки данных, а затем вызвать ваши следующие функции.

Если вы вызовете его после первого метода, то 2-й метод будет выполнен без первого

Комментарии:

1. Я знаю, я прошу найти другое решение

Ответ №2:

Я думаю, что вам следует прояснить эту часть вашего вопроса :

«Но я не хочу этого делать, потому что мне нужно использовать петлю, а это займет слишком много времени».

Какой цикл вам нужно использовать ? Потому что, возможно, в основе проблемы лежит ограничение …

С тем, что вы объяснили, я вижу (по крайней мере) это решение :

 componentMethod() {  // get from the service  return this.otherService.serviceMethod().pipe(  map(data =gt; {  this.array = data;  })  ); }  mainMethodMethod(){  componentMethod().subscribe(() =gt; {  secondMethod();  }) }  

Комментарии:

1. Я бы предложил использовать tap вместо map этого, потому что вы действительно ничего здесь не отображаете и не используете вычисленный результат

2. Ты прав, Алексей !!