Наблюдаемая строка становится массивом

#angular #rxjs

#angular #rxjs

Вопрос:

У меня есть этот код rxjs:

  private getString(): Observable<string> {
    return from(randomString());
  }

 private transformString(text: string): Observable<string> {
    let newString = text.split("").reverse().join("");
    console.log(newString); <--- all looking good, getting a single string
    return from(newString);
  }

  public getString(): Observable<any> {
    return this.randomString().pipe(
      switchMap((myString) => this.transformString(myString))
    );
  }
  

Однако возникает проблема, когда я получаю конечный результат в subscription, он создает массив строк моей новой строки

 getString().subscribe(str => {
    console.log(str)  <--- prints an array but I am expecting to get just one single reversed string
});
  

Можете ли вы объяснить, почему это происходит и как это исправить?

Комментарии:

1. Что, если вы это сделаете return of(newString) ?

2. @AlexanderStaroselsky сделано, то же самое, но если я делаю of("abc") — работает, но если я of(text.split("").reverse().join("")) делаю, не работает

Ответ №1:

from не интерпретирует аргумент для создания наблюдаемого, как вы ожидаете.

В частности, обратите внимание на объяснение из связанной документации:

Строка в этом контексте рассматривается как массив символов.

Если вы хотите, чтобы ваш фрагмент работал с использованием from specfically, вам нужно заключить аргумент в квадратные скобки. То есть:

 return from([newString]);
  

И ниже приведена лишь демонстрация разницы между from и of использованием:

 const { from, of } = rxjs;

// 'h', 'e', 'l', 'l', 'o'
from('hello').subscribe(console.log);

// 'hello'
of('hello').subscribe(console.log);

// 'hello'
from(['hello']).subscribe(console.log);  
 <script src="https://unpkg.com/rxjs@6.6.3/bundles/rxjs.umd.min.js"></script>  

Ответ №2:

Поскольку строка должна быть возвращена как наблюдаемая, использование метода of класса Observable должно работать

 import { Observable } from 'rxjs/Observable';

return Observable.of(newString)
  

Ответ №3:

Начиная с операторов rxjs, она будет выдавать преобразованное значение как наблюдаемое. Поэтому нет необходимости создавать наблюдаемую явно для преобразованного значения.

Пожалуйста, измените функцию transformString, как показано ниже, если вы намерены получить преобразованную строку при ее подписке.

 private transformString(text: string): string {
    let newString = text.split("").reverse().join("");
    console.log(newString);
    return newString;
}