Свойство ‘then’ не существует для типа ‘Подписка’ (Angular 9)

#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. Я все еще ничего не получаю в консоли. Я знаю, что сообщение проходит, потому что я вижу, как оно выполняет внутренние операции в терминале, но по какой-то причине я не могу получить ответ здесь, во внешнем интерфейсе