javascript - Diferença entre os métodos .pipe() e .subscribe() em um observável RXJS
Percebi recentemente que posso retornar um valor dentro de .pipe(), mas não dentro de .subscribe().
Qual é a diferença entre esses dois métodos?
Por exemplo, se eu tiver essa função, vamos chamá-la de 'depositar', que supostamente deve retornar o saldo da conta, se eu fizer isso:
deposit(account, amount){
return this.http.get('url')
.subscribe(res => {
return res;
}
}
Ele retorna um observável e se eu fizer isso:
deposit(account, amount){
return this.http.get('url')
.pipe(
map(res => {
return res;
});
);
}
Ele retorna o saldo da conta como esperado.
Então por quê?
Resposta #1
O método pipe é para encadear operadores observáveis, e o subscribe é para ativar o observável e ouvir os valores emitidos.
O método pipe foi adicionado para permitir que o webpack descarte operadores não utilizados do bundle final de JavaScript. Isso facilita a criação de arquivos menores.
Por exemplo, se eu tiver essa função, vamos chamá-la de 'depositar', que deveria retornar o saldo da conta, se eu fizer isto:
deposit(account, amount){ return this.http.get('url') .subscribe(res => { return res; } }Ele retorna um observável
Isso não é o que ele retorna. Ele retorna o objeto Subscription criado quando você chamou Subscribe.
e se eu fizer isto:
deposit(account, amount){ return this.http.get('url') .pipe( map(res => { return res; }); ); }Ele retorna o saldo da conta como esperado.
Isso não é o que ele retorna. Ele retorna um Observable que usa um operador map. O operador map no seu exemplo não faz nada.
Resposta #2
Exemplos
Uma diferença importante é que, se você não executar subscribe, a requisição nunca será enviada e pipe nunca será executado. Aqui estão exemplos que funcionam e mostram a diferença:
Inscrever-se
const { interval, of } = rxjs; const { delay, take } = rxjs.operators; this.http = { get: (url)=> of(url).pipe(delay(1000), take(1)) } // request simulator deposit = (account, amount) => { return this.http.get('url') .subscribe(res => { console.log('hello from subscriber'); return res; }) } let subscription = deposit('',''); // immediately send request // you can cancel request by subscription.unsubscribe() console.log('subscribed');<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.min.js" integrity="sha256-85uCh8dPb35sH3WK435rtYUKALbcvEQFC65eg+raeuc=" crossorigin="anonymous"></script>Tubo
const { interval, of, } = rxjs; const { delay, take, map } = rxjs.operators; this.http = { get: (url)=> of(url).pipe(delay(1000), take(1)) } // request simulator deposit = (account, amount) => { return this.http.get('url') .pipe( map(res => { console.log('hello from pipe'); return res; }) ); } const observable = deposit('',''); // this will return observable and do nothing console.log('nothing happen');<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.min.js" integrity="sha256-85uCh8dPb35sH3WK435rtYUKALbcvEQFC65eg+raeuc=" crossorigin="anonymous"></script>Pipe + Assinar
const { interval, of, } = rxjs; const { delay, take, map } = rxjs.operators; this.http = { get: (url)=> of(url).pipe(delay(1000), take(1)) } // request simulator deposit = (account, amount) => { return this.http.get('url') .pipe( map(res => { console.log('hello from pipe'); return res; }) ); } const observable = deposit('',''); // this will return observable and do nothing const subscription = observable.subscribe(result => { // this will send request console.log('hello from subscriber') }); // subscription.unsubscribe() - this will cancel request<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.5.5/rxjs.umd.min.js" integrity="sha256-85uCh8dPb35sH3WK435rtYUKALbcvEQFC65eg+raeuc=" crossorigin="anonymous"></script>
