• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

return w Angular

0 głosów
426 wizyt
pytanie zadane 20 lutego 2021 w JavaScript przez Szyszka Gaduła (3,530 p.)

Witam. Mam takie coś w Angularze:

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { NgForm } from '@angular/forms';

@Injectable()
export class AccountService {

  constructor(private http: HttpClient) { }

  logIn(form: NgForm): boolean {
    const credentials = form.value as JSON;
    let bool = false;

    console.log(credentials);
    this.http.post('https://localhost:44305/api/auth/login', credentials)
      .subscribe(data => {
        const token = (data as any).token;
        localStorage.setItem('jwt', token);
        bool = true;
      }, err => {
        bool = false;
      });
    return bool;
  }
}

Dlaczego to zawsze zwraca mi false, nawet jeśli ten bool ustawię na true? Dzięki za odpowiedzi.

2 odpowiedzi

+2 głosów
odpowiedź 20 lutego 2021 przez ScriptyChris Mędrzec (190,170 p.)
wybrane 20 lutego 2021 przez Szyszka
 
Najlepsza

Wartość true ustawiasz przy obsłudze promisa, a on wykona się później niż return false z metody logIn. Zwróć z tej metody całe zapytanie http.post (zapisz return w 5 linijce) - dodatkowo zmień typ zwracanej wartości z tej metody z boolean na Promise<boolean>. A jeśli logIn wołasz w templatce, to możesz się wspomóc async pipe

1
komentarz 20 lutego 2021 przez Szyszka Gaduła (3,530 p.)

Dzięki, zrobiłem tak:

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
import { NgForm } from '@angular/forms';
import { Observable } from 'rxjs';

@Injectable()
export class AccountService {

  constructor(private http: HttpClient) { }

  logIn(form: NgForm): Observable<object> {
    const credentials = form.value as JSON;
    return this.http.post('https://localhost:44305/api/auth/login', credentials);
  }
}

A potem tak:

import { Component } from '@angular/core';
import { NgForm } from '@angular/forms';
import { AccountService } from './services/account.service';

@Component({
  selector: 'app-root',
  templateUrl: './app.component.html',
  styleUrls: ['./app.component.css'],
  providers: [AccountService]
})
export class AppComponent {
  title = 'JWT';

  constructor(private accService: AccountService) {

  }

  logIn(form: NgForm): void {
    const logged = this.accService.logIn(form);

    logged.subscribe(data => {
      const token = (data as any).token;
      localStorage.setItem('jwt', token);
      console.log('tak');
    }, err => {
      console.log('nie');
    });
  }
}

I wszystko działa. Wielkie dzięki :)

0 głosów
odpowiedź 20 lutego 2021 przez maciej.tokarz Nałogowiec (27,260 p.)

Najprościej rzecz ujmując, zanim otrzymasz rezultat tego POST-a zadziała Twój:

return bool;

M.

Podobne pytania

+2 głosów
1 odpowiedź 1,312 wizyt
pytanie zadane 5 maja 2023 w JavaScript przez mm Użytkownik (890 p.)
+2 głosów
1 odpowiedź 686 wizyt
pytanie zadane 2 maja 2023 w JavaScript przez mm Użytkownik (890 p.)
+2 głosów
1 odpowiedź 659 wizyt
pytanie zadane 23 kwietnia 2023 w JavaScript przez mm Użytkownik (890 p.)

93,786 zapytań

142,748 odpowiedzi

323,418 komentarzy

63,391 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...