Rxjs Observable.take(1) vs Subscription.unsubscribe()

Есть ли различия между

Observable.pipe(take(1)).subscribe(...)

против

const subscription = Observable.subscribe(() => {
   // Do something, then
   subscription.unsubscribe()
})

Ответ 1

Подход take(1) имеет ряд преимуществ перед subscribe:

  1. Читаемость кода (и элегантность).
  2. Второй подход требует, чтобы вы держали и управляли дополнительными переменными.
  3. Второй подход не вызовет полный обработчик. Это потому, что.take(1) на самом деле создает новую наблюдаемую, которая потенциально дает один элемент и завершается.
  4. Второй подход будет работать для тривиального случая взятия одного элемента, но если вам нужно взять больше, чем 1, take(4) останется простым, в то время как второй подход станет трудным для кодирования.

Третий пункт относится к rxjs, остальные относятся к стилю кодирования.

Посмотрите на образец здесь.

Ответ 2

В Angular2 я использую обе парадигмы.

Первое наиболее удобно использовать внутри метода, поскольку второй лучше использовать в конструкторе с очисткой в ​​деконструкторе.

doThing(){
    this.store.select('thing')
        .take(1)
        .subscribe(item => {
            otherMethod(item)
        });
}

против

class SomeClass{
    public val;
    private sub;
    constructor(){
        this.sub = this.store.select('thing')
            .subscribe(item => {
                this.val = item
            });
    }
    ngDestroy() {
        this.sub.unsubscribe()
    }
}