Как иметь функцию asyn c внутри подписки ts angular - PullRequest
0 голосов
/ 25 мая 2020

У меня есть поле ввода, которое на valueChange вызывает асинхронную c функцию, которая вызывает API.

    this.searchFrom = new FormGroup({
      ss: new FormControl()
    });
    this.searchFrom.valueChanges
      .pipe(debounceTime(500))
      .pipe(distinctUntilChanged())
      .subscribe((b) => {
        this.search(b);
      });
  search(ss: string) {
    console.log("? API");
    this.http.post(endpoint + 'search', { 'ss': ss })
      .toPromise()
      .then((data) => {
        this.data = data;
        console.log(data);
        return data;
      })
      .catch((err) => {
        console.error(err);
      })
      .finally(() => {
        console.log("✅✅");
      });
  }

Она просто вызывает функцию, а не .then В консоли. log получаю только:

> ? API

Ответы [ 2 ]

0 голосов
/ 25 мая 2020

Не уверен, почему вы конвертируете наблюдаемое в обещание, в любом случае у меня есть другой подход к решению вашей проблемы,

Попробуйте это

 this.searchFrom.valueChanges.pipe(
            map(value => value.ss),
            debounceTime(500),
            distinctUntilChanged(),
            switchMap(search => this.search(search))
 ).subscribe(data => console.log(data));

 search(ss: string) {
  return this.http.post(endpoint + 'search', { 'ss': ss })
 }
0 голосов
/ 25 мая 2020

Вы должны узнать о rx js и операторах it.

Вот рабочее решение:

this.searchFrom = new FormGroup({
    ss: new FormControl()
});

this.searchFrom.valueChanges
.pipe(
    debounceTime(500),
    distinctUntilChanged(),
    switchMap(x => this.search(x.ss))
).subscribe((result) => {
    // result contains HTTP-result if non Error
});


search(ss: string) {
    console.log("? API");
    return this.http.post(endpoint + 'search', { 'ss': ss });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...