#angular #httpclient #angular8 #angular9
#angular #httpclient #angular8 #angular9
Вопрос:
Я пытаюсь выполнить некоторые операции с данными, которые я извлекаю HttpClient
, а затем перенаправить страницу после выполнения этих операций. По-видимому, я не могу использовать then
для этого, но я не могу найти, как еще перенаправить страницу после выполнения операций. В противном случае, если я попытаюсь запустить операции и маршрутизацию в одной и той же функции, страница, похоже, попытается выполнить маршрутизацию до выполнения других операций.
Вот мой код:
import { Component, OnInit, ChangeDetectorRef } from '@angular/core';
import { Router } from '@angular/router';
import { NbAuthSocialLink } from '@nebular/auth';
import { NbAuthService } from '@nebular/auth';
import { DataService } from '../@core/utils/data.service';
@Component({
selector: 'ngx-auth',
templateUrl: './auth.component.html',
styleUrls: ['./auth.component.css']
})
export class AuthComponent implements OnInit {
constructor(
private dataService : DataService,
private router : Router
){}
ngOnInit(){
}
textAnalysis(name, text){
this.dataService.sendText(text).subscribe((data: any[])=>{
console.log(data)
localStorage.setItem('user_name', name)
localStorage.setItem('insights', JSON.stringify(data));
console.log('localStorage json stringified object item set to: insights')
console.log("<----------test: should output 'Imagination'---------->")
console.log(data['personality'][0]['children'][3]['name'])
}).then(() => {
this.router.navigate(['/pages']);
})
}
}
}
и DataService
функция:
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
const httpOptions = {
};
declare var google: any;
@Injectable({
providedIn: 'root',
})
export class DataService {
constructor(private http: HttpClient) { }
public sendText(data){
return this.http.post("//localhost:8000/personalityFromText", data, {withCredentials: true});
}
Комментарии:
1. Подписка на наблюдаемый объект дает вам подписку, а не обещание. Почему эта строка не может быть в обратном вызове subscribe?
2. Не могли бы вы показать мне, что вы имеете в виду?
3. Компилятор говорит вам, что я имею в виду, это то, что «свойство ‘then’ не существует для типа ‘Subscription’l говорит; это не обещание.
4. Где вы вызываете
textAnalysis()
функцию? Вы хотите дождаться завершения этой функции перед маршрутизацией?
Ответ №1:
Вам не нужно реализовывать блок then, просто поместите свою навигацию в блок успеха подписки.
textAnalysis(name, text){
this.dataService.sendText(text).subscribe((data: any[])=>{
console.log(data)
localStorage.setItem('user_name', name)
localStorage.setItem('insights', JSON.stringify(data));
console.log('localStorage json stringified object item set to: insights')
console.log("<----------test: should output 'Imagination'---------->")
console.log(data['personality'][0]['children'][3]['name'])
this.router.navigate(['/pages']);
});
Комментарии:
1. Когда я это делаю, оно маршрутизируется до завершения других операций. Я пытался перенаправить его после завершения других операций
2. Он не может выполнить маршрутизацию до завершения операции. Он попадает внутрь блока успешной подписки только после выполнения указанной асинхронной операции.
3. Я имел в виду операции
localStorage
иconsole.log
в рамках успешного обратного вызова. Он выполняет маршрутизацию перед запуском этих функций4. Не могли бы вы, пожалуйста, написать другое консольное заявление после заявления маршрутизатора и поделиться скриншотом.
5. Ничего не отображается, никаких журналов, просто ошибка `XHR failed loading: POST`
Ответ №2:
HttpClient является наблюдаемым, а не обещанием, поэтому вам нужно будет выполнить это с помощью канала, думайте как цепочки шагов, например, так:
this.dataService.sendText(text).pipe(
tap(data => localStorage.setItem('user_name', name)),
tap(data => localStorage.setItem('insights', JSON.stringify(data))),
).subscribe(
(data) => this.router.navigate(['/pages']),
(error) => console.error(error)
);
Существует несколько комбинаций, возможных с использованием других операторов, кроме tap, о которых вы можете прочитать подробнее.
Комментарии:
1. Я все еще получаю
XHR failed loading: POST
ошибку. Я думаю, что у меня может возникнуть более глубокая проблема, чем маршрутизация перед вызовом операций. Я действительно ценю всю вашу помощь, ребята, надеюсь, я смогу разобраться в этом или опубликовать более глубокую проблему в другом сообщении. Спасибо!2. Гул, значит,
post
операция завершилась неудачей? добавьте обработку ошибок в свою подписку, записывая всю ошибку в консоль. Я отредактирую свой ответ, добавив его.3. Я все еще ничего не получаю в консоли. Я знаю, что сообщение проходит, потому что я вижу, как оно выполняет внутренние операции в терминале, но по какой-то причине я не могу получить ответ здесь, во внешнем интерфейсе