Angular'da pipe () işlevi nedir


110

Borular, şablondaki verileri (formatları) dönüştürmek için filtrelerdir.

İşleve pipe()aşağıdaki gibi rastladım . Bu pipe()işlev bu durumda tam olarak ne anlama geliyor?

return this.http.get<Hero>(url)
  .pipe(
    tap(_ => this.log(`fetched hero id=${id}`)),
    catchError(this.handleError<Hero>(`getHero id=${id}`))
);


4
@Ajay Bu sayfayı ve bir sürü referans alıyorum | kullanır. Bu da rxjs borularının ne olduğuna cevap vermiyor.
182764125216

Yanıtlar:


125

Angular ve RxJS kavramlarıyla karıştırmayın

pipe()Angular'da boru konseptimiz ve RxJS'de fonksiyonumuz var.

1) Açısal Borular : Bir boru, verileri girdi olarak alır ve istenen çıktıya dönüştürür
https://angular.io/guide/pipes

2) pipe()RxJS'de işlev : Operatörleri birbirine bağlamak için boruları kullanabilirsiniz. Borular, birden fazla işlevi tek bir işlevde birleştirmenize izin verir.

pipe()İşlevi argüman olarak Birleştirmek istediğiniz işlevleri alır ve, çalıştırıldığında, sırayla oluşan fonksiyonları çalışır yeni bir işlev döndürür.
https://angular.io/guide/rx-library (bu URL'de boruları arayın, aynısını bulabilirsiniz)

Yani sorunuza göre pipe(), RxJS'de işlevden bahsediyorsunuz


44

Başlangıç ​​açıklamasında bahsettiğiniz Borular, örnekte gösterdiğiniz borudan farklı.

Açısal (2 | 4 | 5) Borularda, söylediğiniz gibi görünümü biçimlendirmek için kullanılır. Angular'da borular hakkında temel bir anlayışa sahip olduğunuzu düşünüyorum, bu bağlantıdan daha fazla bilgi edinebilirsiniz - Açılı Boru Belgesi

pipe()Eğer örnekte göstermiştir olduğu pipe()yöntem RxJS 5.5 (RxJS tüm Eğik uygulamalar için varsayılan). Gelen Angular5 tüm RxJS operatörleri bir içe kullanılarak alınabilir ve artık boru yöntemiyle birleştirilir.

tap()- RxJS musluk operatörü Gözlemlenebilir değere bakacak ve bu değerle bir şeyler yapacaktır. Başka bir deyişle, başarılı bir API talebinden sonra, tap()operatör yanıtla birlikte gerçekleştirmesini istediğiniz herhangi bir işlevi yerine getirecektir. Örnekte, yalnızca bu dizeyi günlüğe kaydedecektir.

catchError()- catchError tam olarak aynı şeyi yapar ancak hata yanıtı verir. Bir hata atmak istiyorsanız veya bir hata alırsanız bir işlevi çağırmak istiyorsanız, bunu buradan yapabilirsiniz. Örnekte, arayacak handleError()ve bunun içinde sadece o dizeyi günlüğe kaydedecektir.


"bahsettiğiniz borular başlangıç ​​açıklamasında ..." -> hayır, farklı değiller. ; Benim görüşüme göre sorusu tamamen açıktı (mümkün olan hiçbir karışıklık yoktu). Programlamada "boru" olarak adlandırılabilecek birçok kavram vardır, ancak açıklamasında çok spesifik olması ve bunları "boru işlevleri" olarak adlandırmasıyla olası tüm karışıklıkları ortadan kaldırmıştır. Onları başka nasıl arayabileceğini bilmiyordum.
bvdb

1
"Borular, şablondaki verileri (formatları) dönüştürmek için filtrelerdir." Burada Angular 2+ 'de borudan bahsediyordu, tıpkı tarih gibi, Angular'da sağlanan büyük harfli borular (tam olarak ne dediğini yapıyor, yani şablondaki verileri biçimlendiriyor) Ve açıklamada RXJS boru işlevi örneğini gösterdi . Yani evet bu 2 şey tamamen farklı.
BhargavG

Geri alıyorum, mea culpa. Bu cümleyi gözden kaçırdı. Keşke -1'i geri alabilseydim. :( Ama maalesef kilitli.
bvdb

bu büyük bir anlaşma değil. Tüm şüpheleri temizlediği için mutluyum. Şerefe :-)
BhargavG

15

RxJS Operatörleri, koleksiyonların sofistike bir şekilde işlenmesini sağlamak için gözlemlenebilir temeli üzerine inşa edilen işlevlerdir.

Örneğin, RxJS gibi operatörler tanımlar map(), filter(), concat()ve flatMap().

Operatörleri birbirine bağlamak için boruları kullanabilirsiniz. Borular, birden fazla işlevi tek bir işlevde birleştirmenize izin verir.

pipe()İşlevi argüman olarak Birleştirmek istediğiniz işlevleri alır ve, çalıştırıldığında, sırayla oluşan fonksiyonları çalışır yeni bir işlev döndürür.


Bir örnek var mı
lofihelsinki

Aşağıdaki örnekte filtre ve harita fonksiyonunu boruladık. Şimdi her iki işlev de örnekte gösterildiği gibi sırayla çalıştırılacaktır. Önce sonucu filtreleyecek ve ardından sonuçları haritalayacaktır. Umarım yardımcı olur. "rxjs / operators" dan {filter, map} içe aktar; const squareOdd = of (1, 2, 3, 4, 5) .pipe (filtre (n => n% 2! == 0), map (n => n * n)); // Değerleri almak için abone olun squareOdd.subscribe (x => console.log (x));
manoj

Gerçekten mükemmel yanıt, ancak çok az sayıda ek oy olması talihsiz bir durum. Benden +1.
Ashok kumar

7

Resmi ReactiveX belgelerine bakmalısınız: https://github.com/ReactiveX/rxjs/blob/master/doc/pipeable-operators.md .

Bu, RxJS'de borulama hakkında iyi bir makaledir: https://blog.hackages.io/rxjs-5-5-piping-all-the-things-9d469d1b3f44 .

Kısacası .pipe (), birden fazla yönlendirilebilir operatörün zincirlenmesine izin verir.

5.5 sürümünden itibaren RxJS, "yönlendirilebilir operatörler" göndermiş ve bazı operatörleri yeniden adlandırmıştır:

do -> tap
catch -> catchError
switch -> switchAll
finally -> finalize

6

İki farklı tipte Köşeli Boru - Borular ve RxJS - Borular

Açısal Boru

Bir boru, verileri girdi olarak alır ve istenen çıktıya dönüştürür. Bu sayfada, bir bileşenin doğum günü özelliğini insan dostu bir tarihe dönüştürmek için borular kullanacaksınız.

import { Component } from '@angular/core';

@Component({
  selector: 'app-hero-birthday',
  template: `<p>The hero's birthday is {{ birthday | date }}</p>`
})
export class HeroBirthdayComponent {
  birthday = new Date(1988, 3, 15); // April 15, 1988
}

RxJS - Boru

Gözlemlenebilir operatörler, Pipeable Operators olarak bilinen bir boru yöntemi kullanılarak oluşturulur. İşte bir örnek.

import {Observable, range} from 'rxjs';
import {map, filter} from 'rxjs/operators';

const source$: Observable<number> = range(0, 10);

source$.pipe(
    map(x => x * 2),
    filter(x => x % 3 === 0)
).subscribe(x => console.log(x));

Bunun konsoldaki çıktısı aşağıdaki gibi olacaktır:

0

6

12

18

Bir gözlemlenebilir olan herhangi bir değişken için, gözlemlenebilir koleksiyondaki her bir öğe üzerinde çalışabilen ve onu dönüştürebilen bir veya daha fazla operatör işlevini geçirmek için .pipe () yöntemini kullanabiliriz.

Dolayısıyla bu örnek, 0 ile 10 arasındaki her bir sayıyı alır ve 2 ile çarpar. Daha sonra, sonucu yalnızca tek sayılara göre filtrelemek için filtre işlevi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.