#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. Ты прав, Алексей !!