Vaatler ve Gözlemlenebilirler arasındaki fark nedir?


1397

Angular Promiseve Observableangular arasındaki fark nedir ?

Her birine bir örnek her iki vakanın da anlaşılmasında yardımcı olacaktır. Her senaryoyu hangi senaryoda kullanabiliriz?


23
Bu yazıyı okumanızı öneririm; Angular2 Promise vs. Gözlemlenebilir
Erolkaya84

4
daha basit terimlerle açısal-2
training-

3
Bu soru ve cevapları okuyan herkes için, her iki dünyada da bir koruyucu, konuşmacı ve uzun süreli kullanıcı PoV'sinden biri olarak resmi RxJS belgelerini ve sözler hakkındaki MDN belgelerini okumanızı tavsiye ederim. Kişisel olarak burada cevapları tamamen yanıltıcı ve yanlış buluyorum ve inanıyorum ki, yardım etmeye çalışan insanların iyi niyetleri ile çok zararlı.
Benjamin Gruenbaum

1
Bu açısal resmi belge okumanızı öneririm angular.io/guide/comparing-observables
fgul

Bu yüzden bağlantılar cevap olarak kabul edilemez olarak kabul edilir.
Dave

Yanıtlar:


1550

Söz vermek

Bir zaman uyumsuz işlem tamamlandığında veya başarısız olduğunda tek bir olayıPromise işler .

Not: PromiseDışarıda iptal işlemini destekleyen kütüphaneler var, ancak ES6 Promiseşu ana kadar değil.

izlenebilir

An Observablebir gibidirStream (birçok dilde) gibidir ve her olay için geri aramanın çağrıldığı sıfır veya daha fazla olayı iletmeye izin verir.

Genellikle ve daha fazlasını sağladığı için Observabletercih edilir . İle Eğer 0, 1 veya birden fazla olayları ele istiyorsanız bunun önemi yoktur. Her durumda aynı API'yı kullanabilirsiniz.PromisePromiseObservable

Observableayrıca iptalPromise edilebilir olma avantajına sahiptir . Bir sunucu veya başka bir pahalı zaman uyumsuz işlem için bir HTTP isteğinin sonucu artık gerekli değilse, bir bir bir süre, aboneliği iptal sağlarSubscriptionObservablePromise bildirim gerekmez bile sonuçta başarı veya başarısız geri arama arayacak veya artık sağladığı sonuç.

Gözlemlenebilir sağlar operatörleri gibi map, forEach, reducebir diziye benzer ...

Ayrıca retry(), ya da replay()... gibi , genellikle oldukça kullanışlı olan güçlü operatörler de vardır .


180
Öyleyse, tek geri arama durumunda Gözlemlenebilir yerine Promise kullanmak için iyi bir neden var mı veya Gözlemlenebilirler de bu şekilde çalışabildikleri için orada mı kullanılmalıdır? Temel olarak, "Her şeyi gözlenebilir" için iyi bir uygulama mı yoksa Promise'in yeri hala var mı?
Josh Werts

75
Reaktif stili kullanmak istiyorsanız, her yerde gözlemlenebilir kullanın. Eğer gözlemlenebilirleriniz varsa sadece beste yapabilirsiniz. Onları karıştırırsanız artık o kadar temiz değil. Reaktif tarzı önemsemiyorsanız, olay akışları için iptal edilebilir ve gözlemlenebilir olmadığınızı ummadığınız tek olaylar için vaat kullanabilirsiniz.
Günter Zöchbauer

35
@ GünterZöchbauer Hey - Gözlemlenebilirler veya işlevsel programlamaya karşı hiçbir iddiam yok. Basitçe söylemek gerekirse, temelde NG2'de Gözlemlenebilirlik'e giren insanların, arama yapmak için Gözlemler'i Vaatler üzerinde kullanmak için gerçek bir nedenleri olmadığına inanıyorum. Vaatlerle pratik hiçbir şey kaybetmezler. Açılma ve yeniden deneme işleçleri önemsizdir - ng-debounce ile bırakabilirsiniz ve bir çağrının başarısız olması bekleniyorsa, genellikle kodda bir sorun vardır. Çağrıları yeniden denemek için gereken tek zaman, HVT için kararsız üçüncü taraf API'lerini sorgularken oldu.
VSO

92
Ancak Promise, unutmayın async/ awaitkodunuzu tekrar düz hale getirir! Çoğu durumda ve roket bilimiyle ilgilenmeyen projelerde, bu korkunç iç içe geçmiş işlevleri gereksiz yere karmaşık yöntemlerle yazmanıza gerek yoktur. async/ awaitBugün transistörler ile kullanabilirsiniz ve kazan plakası TypeScriptolmadan insan tarafından okunabilir gerçek düz kodu yazabilirsiniz rxjs. Muhtemelen rxjsbazen belirli durumlarda ihtiyacınız olacaktır , çünkü gerçekten sunacak çok şey var.
evilkos

15
Bu cevap yanıltıcıdır, gözlemlenebilir bir akış gibi değildir , bir akış döndüren bir işlev gibidir .
Benjamin Gruenbaum

335

Hem Promisesve Observablesbizi başa yardımıyla bu soyutlama bize asenkron bizim uygulamaların doğası. Aralarındaki fark @ Günter ve @Relu tarafından açıkça belirtildi.

Bir kod pasajı bin kelimeye bedel olduğundan, bunları daha kolay anlamak için aşağıdaki örneği inceleyelim.

@Christoph Burgdorf harika makale için teşekkürler


Açısal, HTTP ile ilgili vaat yerine Rx.js Gözlemlenebilir kullanır.

Siz yazarken sonuçları anında göstermesi gereken bir arama işlevi oluşturduğunuzu varsayalım . Kulağa tanıdık geliyor, ancak bu görevle ilgili birçok zorluk var.

  • Kullanıcı bir tuşa her bastığında sunucu uç noktasına vurmak istemiyoruz; HTTP . Temel olarak, yalnızca kullanıcı her tuş vuruşu yerine yazmayı bıraktığında vurmak istiyoruz.
  • Arama bitiş noktasına aynı sorgu parametreleriyle vurmayınSonraki istekler için .
  • Sıra dışı yanıtlarla ilgilenin. Uçuş sırasında aynı anda birden fazla isteğimiz olduğunda, beklenmedik sırada geri geldikleri durumları hesaba katmalıyız. Önce bilgisayar yazdığımızı, durduğumuzu , bir istek bittiğini, araba yazdığımızı, durduğumuzu, bir isteğin gittiğini hayal edin . Şimdi uçuşta iki isteğimiz var. Ne yazık ki, sonuçlarını taşıyan istek bilgisayarın sonuçlarını taşıyan istekten sonra geri gelir arabaya .

Demo sadece iki dosyadan oluşacaktır: app.tsve wikipedia-service.ts. Gerçek dünya senaryosunda, büyük olasılıkla işleri daha da bölebiliriz.


Aşağıda açıklanan uç durumların hiçbirini ele almayan Söz tabanlı uygulama yer almaktadır.

wikipedia-service.ts

import { Injectable } from '@angular/core';
import { URLSearchParams, Jsonp } from '@angular/http';

@Injectable()
export class WikipediaService {
  constructor(private jsonp: Jsonp) {}

  search (term: string) {
    var search = new URLSearchParams()
    search.set('action', 'opensearch');
    search.set('search', term);
    search.set('format', 'json');
    return this.jsonp
                .get('http://en.wikipedia.org/w/api.php?callback=JSONP_CALLBACK', { search })
                .toPromise()
                .then((response) => response.json()[1]);
  }
}

Belirli bir arama terimiyle Wikipedia API'sına istekte bulunmak için Jsonphizmeti enjekte ediyoruz . A noktasından a noktasına gitmek için aradığımız dikkat edin . Sonunda arama yöntemimizin dönüş türü olarak a ile sonuçlanır.GETtoPromiseObservable<Response>Promise<Response>Promise<Array<string>>

app.ts

// check the plnkr for the full list of imports
import {...} from '...';

@Component({
  selector: 'my-app',
  template: `
    <div>
      <h2>Wikipedia Search</h2>
      <input #term type="text" (keyup)="search(term.value)">
      <ul>
        <li *ngFor="let item of items">{{item}}</li>
      </ul>
    </div>
  `
})
export class AppComponent {
  items: Array<string>;

  constructor(private wikipediaService: WikipediaService) {}

  search(term) {
    this.wikipediaService.search(term)
                         .then(items => this.items = items);
  }
}

Burada da pek bir sürpriz yok. Bizim için WikipediaServicebir arama yöntemi kullanarak işlevselliğini enjekte edip ortaya koyarız. Şablon sadece tuşlara ve çağrılara bağlanırsearch(term.value) .

Biz sonucunu ambalajından Promise WikipediaService getiri arama yöntemi ve sahip böylece şablona dizeleri basit Array olarak maruz olduğunu*ngFor içinden döngü ve bizim için bir liste oluşturmak.

Örneğini inceleyin Promise tabanlı üzerinde uygulanması Plunker


Nerede Gözlenebilirler gerçekten parlamaya

Her tuş vuruşunda uç noktayı kırmamak için kodumuzu değiştirelim, bunun yerine yalnızca kullanıcı 400 ms yazmayı bıraktığında bir istek gönderelim

Bu tür süper güçleri açığa çıkarmak için önce Observable<string>kullanıcının yazdığı arama terimini taşıyan bir tane almamız gerekir . Keyup olayına manuel olarak bağlanmak yerine Angular formControlyönergesinden yararlanabiliriz. Bu yönergeyi kullanmak için, öncelikle ReactiveFormsModuleuygulama modülümüze aktarmamız gerekir.

app.ts

import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { JsonpModule } from '@angular/http';
import { ReactiveFormsModule } from '@angular/forms';

@NgModule({
  imports: [BrowserModule, JsonpModule, ReactiveFormsModule]
  declarations: [AppComponent],
  bootstrap: [AppComponent]
})
export class AppModule {}

İçe aktarıldıktan sonra, şablonumuzdan formControl'ü kullanabilir ve "terim" adına ayarlayabiliriz.

<input type="text" [formControl]="term"/>

Bizim bileşeni olarak, bir örneğini oluşturmak FormControldan@angular/form ve bizim bileşeni üzerinde isim terimi altında bir alan olarak maruz kalmaktadır.

Perde arkasında, terim otomatik Observable<string>olarak valueChangesabone olabileceğimiz bir özellik olarak ortaya çıkarır . Artık bir Observable<string>, kullanıcı girişinin üstesinden gelmek debounceTime(400)bizim telefonumuzu aramak kadar kolay Observable. Bu, Observable<string>yalnızca 400 ms boyunca yeni değerler gelmediğinde yeni bir değer yayan bir yeni döndürür .

export class App {
  items: Array<string>;
  term = new FormControl();
  constructor(private wikipediaService: WikipediaService) {
    this.term.valueChanges
              .debounceTime(400)        // wait for 400ms pause in events
              .distinctUntilChanged()   // ignore if next search term is same as previous
              .subscribe(term => this.wikipediaService.search(term).then(items => this.items = items));
  }
}

Uygulamamızın zaten sonuçları gösterdiği bir arama terimi için başka bir istek göndermek kaynak kaybı olacaktır. İstenen davranışı elde etmek için tek yapmamız gereken, distinctUntilChangedaradıktan hemen sonra operatörü aramaktır.debounceTime(400)

Örneğini inceleyin gözlemlenebilir üzerinde uygulanması Plunker

Sıra dışı yanıtlarla uğraşmak için lütfen http://blog.thoughtram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html makalenin tamamını inceleyin.

Http'yi Angular'da kullandığım sürece, normal kullanım durumlarında Promise over Promerv'ı kullanırken çok fazla fark olmadığını kabul ediyorum. Avantajların hiçbiri burada pratikte gerçekten alakalı değildir. Umarım gelecekte bazı gelişmiş kullanım durumlarını görebilirim :)


Daha fazla bilgi edin


31
Http hizmetini Gözlemlenebilir tabanlı hale getirme kararını tamamen almıyorum. Duyduğum her açıklama aynı örneğe dayanıyor: Terime göre arama. Ancak bu, tarayıcı olaylarını ele almakla ilgilidir. Eşzamansız http istekleriyle uğraşırken bu uygulamanın avantajının ne olduğunu duymak isterim.
Alex Pollan

1
Karar karışık kalıplardan kaçınmak için yanlışlıkla mı yapıldı?
Alex Pollan

6
@AlexPollan, aslında Ben Lesh ile bu podcast gözlemlenebilir dönen http hizmetinin yararları için iyi bir açıklama var: devchat.tv/js-jabber/… . Nihayetinde, en büyük yararı, gözlemlenebilir ve yukarıdaki bağlantıda açıklanan bir kullanım örneğini - biraz çelişkili iken - iptal edebilmenizdir; aradığınız apis ilk önce size geri döner, daha sonra başkalarına istekleri iptal edebilirsiniz.
nikolasleblanc

2
@nikolasleblanc, bunun için $ q.race () kullanabileceğinizden emin misiniz?
Mart'ta 17:28

2
@AlexPollan, Avantajı, Gözlemlenebilir tabanlı bir HTTP hizmetinin uçuş ortasında HTTP isteklerini iptal etmeyi kolaylaştırmasıdır. Trungk18'in cevabındaki yarış koşulu, sonraki bir talepte bulunmadan önce gözlemlenebilir olan HTTP'den abonelikten çıkılarak çözülebilir. RXJS switchMap, başka bir gözlemlenebilir tarafından tetiklenen HTTP istekleri için kullanılabilir (örn. ValueChanges). Bağımsız HTTP gözlemlenebilirleri için, aboneliğinizi iptal edebilir ve manuel olarak yeniden abone olabilirsiniz.
Ocak'ta

236

Hem Sözler hem de Gözlemlenebilirler JavaScript'teki eşzamansız işlevlerle çalışmamıza yardımcı olacaktır . Birçok durumda çok benzerler, ancak ikisi arasında hala bazı farklılıklar vardır, vaatler http çağrıları asynchronousgibi çözümlenecek değerlerdir . Öte yandan, gözlemlenebilirler bir dizi asenkron olayla ilgilenir . Aralarındaki ana farklar aşağıda listelenmiştir:

söz vermek:

  • bir boru hattına sahip olmak
  • genellikle yalnızca zaman uyumsuz veri dönüşüyle ​​kullanılır
  • iptal etmek kolay değil

gözlemlenebilir:

  • iptal edilebilir
  • yeniden deneme ve yeniden deneme gibi doğası gereği yeniden denenebilir
  • birden fazla boru hattında veri akışı
  • harita, filtre vb. gibi dizi benzeri işlemlere sahip olmak
  • etkinlikler gibi diğer kaynaklardan oluşturulabilir
  • bunlar daha sonra abone olabilecek işlevlerdir

Ayrıca, farklılıkları görsel olarak göstermek için aşağıdaki grafik görüntüsünü oluşturdum:

Vaatler ve Gözlenebilirler resmi


4
söz vermek "iptal etmek kolay değil", iptal etmek mümkün mü?
Pardeep Jain

10
evet, onları da iptal etmenin bir yolu var ... bazı insanlar mavi kuş veya üçüncü taraf kütüphaneler kullanıyorlar ... Angular'da Q kütüphanesini kullanarak da iptal etmenin yolları var ... ama dediğim gibi çok kullanışlı değil
Alireza

Bir boru hattına sahip olmak bazen avantajlıdır, ör. APP_INITIALIZER'da birden fazla boru hattınız varsa, bazen bazen veya birden çok kez bitiremez.
windmaomao

6
bir iptali Promise, sözlerin nasıl verildiğini düşünmenin yanlış yoludur. PromiseEş zamansız uyumlu bir şekilde sadece sap başarı veya başarısızlığa sorumluluğu o .. Eğer istek değil, söz iptal http isteği iptal ve yerine getirmek veya Promise reddetmek ya iptal sonucunu olmak için. jsfiddle.net/greggman/ea0yhd4p
gman

2
@gman Aynen. Vaat sadece gelecekteki bir değeri temsil eder . O mu değil temsil değeri oluşturur operasyonu . Bir değeri iptal edemezsiniz. Bir değeri yeniden deneyemezsiniz. Bu sadece bir değer. Henüz mevcut olabilir veya olmayabilir ve bir istisna meydana geldiğinden asla mevcut olmayabilir , ama hepsi bu.
Yona Appletree

75

sözler

  1. Tanım: İşlevleri eşzamansız olarak çalıştırmanıza ve dönüş değerlerini (veya istisnalarını) yalnızca bir kez kullanmanıza yardımcı olur yürütüldüğünde .
  2. Tembel değil
  3. İptal edilemez (İptal işlemini destekleyen Promise kütüphaneleri var, ancak ES6 Promise şu ana kadar değil). İki olası karar
    • reddetmek
    • çözmek
  4. Edilemez denenecek (Sözler olan bir yeniden deneme yeteneği, kötü bir uygulama olması söz döndü orijinal işlevine erişimi olmalıdır)

gözlenebilirler

  1. Tanım: İşlevleri eşzamansız olarak çalıştırmanıza ve yürütüldüğünde dönüş değerlerini sürekli bir sırada ( birden çok kez ) kullanmanıza yardımcı olur .
  2. Varsayılan olarak, zaman ilerlediğinde değer yayar.
  3. Kodlama çabasını kolaylaştıran birçok operatöre sahiptir.
  4. Bir operatör yeniden deneme , gerektiğinde yeniden denemek için kullanılabilir, ayrıca bazı koşullara göre gözlemlenebilir yeniden denememiz gerekirse , yeniden kullanılabilir.

    Not : Operatörlerin bir listesi ve etkileşimli diyagramları burada RxMarbles.com adresinde bulunmaktadır.


67

Cevaplarda Gözlemlenebilir eksiklerin bir dezavantajı var. Vaatler, ES7 zaman uyumsuz / beklemede işlevlerinin kullanılmasına izin verir. Onlarla eşzamanlı bir işlev çağrısı gibi senkronize olmayan kod yazabilirsiniz, böylece artık geri aramalara ihtiyacınız yoktur. Gözlemlenebilirlerin bunu yapması için tek olasılık onları Vaatlere dönüştürmektir. Ancak bunları Promises'a dönüştürdüğünüzde, tekrar yalnızca bir dönüş değeriniz olabilir:

async function getData(){
    const data = await observable.first().toPromise();
    //do stuff with 'data' (no callback function needed)
}

Daha fazla okuma: Bir Rx Gözlemlenebilir'de nasıl 'bekleyebilirim'?


21
Ayrıca kimsenin neden bu katil sözleri göstermediğine şaşırdım - async / bekliyor sayesinde basitlik ve şeffaflık. Sadece düz kod yazma yeteneği için Promises'a geçtim. Basit iş mantığı ve UI etkileşim kodu, roket bilimi gibi görünmemeli ve reaktif uzantıların iç içe cehennemi tarafından kirletilmemelidir. Ayrıca, async / await sadece gelecekte değil, şimdi transpilleri kullanarak kamu üretim uygulamalarında da kullanabilirsiniz. TypeScript 2.3 kullanıyorum ve gerçek bir dil gibi harika.
evilkos

Güzel, ama reaktif bir şekilde düşünmek ve tüm RxOperators ile belki de bu bir katil özellik değil
JorgeTovar

37

Vaatler ve Gözlemlenebilirler her ikisi de yalnızca eşzamansız çağrıyı yönetir.

Aralarındaki farklar:

izlenebilir

  1. Belirli bir süre içinde birden çok değer yayar
  2. Gözlemlenebilir'e abone olana kadar çağrılmaz
  3. Unsubscribe () yöntemi kullanılarak iptal edilebilir
  4. Her biri için harita, filtre, azaltma, yeniden deneme ve yeniden deneme sağlar

Söz vermek

  1. Bir seferde yalnızca tek bir değer yayar

  2. Hizmetleri .then ve .catch olmadan çağırır

  3. İptal edilemez

  4. Operatör sağlamaz


2
Söz ile tam olarak ne demek istiyorsun sadece tek bir değer yayar, gözlemlenebilir çoklu yayar
Abel

2
Bir söz hiç bir değer yaymaz - bir söz zaman içindeki bir değerdir. Bir söz, birden fazla aboneye bu değeri çok noktaya yayınlar - söz verdiğinizde, zaten bir değere sahipsiniz. Gözlemlenebilir bir işlev gibidir , ona abone olmak eylemi başlatır.
Benjamin Gruenbaum

1
@BenjaminGruenbaum Hala birden fazla abonenin ortalamasını alamadım, lütfen bir link veya örnek verebilir misiniz? Teşekkürler
Deepak Patidar

2
obsable1.subscribe (abone1), gözlemlenebilir1.subscribe (abone2) - bu işlevi birden çok kez çağırır .
Benjamin Gruenbaum

2
Lütfen yayınınızı düzenleyin ve ekran görüntüleri yerine gerçek metni gösterin. Diğerleri görüntülerinizden kopyalayıp yapıştıramaz ve ayrıca birçok dilbilgisi hatasını düzeltmenize yardımcı olamaz. Ayrıntılar için buraya bakın. Teşekkür ederim.
Pang

26

Bu cevap gecikmiş olsa da, aşağıdaki farkları özetledim,

gözlemlenebilir:

  1. Gözlemlenebilir sadece olduğunu functionalır an observerve duruma göre bir function Observer: an object with next, error.
  2. Gözlemci subscribe/unsubscribeveri akışına izin verir , gözlemciye bir sonraki değer yayar notify, gözlemci hakkında errorsve gözlemciyistream completion
  3. Gözlemci a function to handle next value, hatalar ve akış sonu sağlar (ui olayları, http yanıtları, web soketli veriler).
  4. İle İşleri multiple valuesüzerinde zaman
  5. Bu cancel-able/retry-ablegibi operatörleri destekler ve destekler map,filter,reduce.
  6. Gözlemlenebilir oluşturmak - Observable.create()- döndürür - Observer Observable.from()- bir diziyi veya yinelenebilir hale dönüştüren - Observable Observable.fromEvent()- bir olayı Gözlenebilir'e Observable.fromPromise()dönüştürür - - bir Sözü Gözlenebilir'e dönüştürür - Observable.range()- belirtilen aralıktaki bir tamsayı dizisini döndürür Gözlemlenebilir olabilir

Söz :

  1. Bir söz, gelecekte bitecek bir görevi temsil eder;

  2. Vaatler olur resolved by a value;

  3. Vaatler istisnalarla reddedilir;

  4. Değil cancellableve geri dönera single value

  5. Bir söz bir işlevi ortaya çıkarır (then)

    -sonra yeni bir şey döndürür promise;

    - için izin verilenler aşağıdakilere attachmentdayalı olarak yürütülür: state ;

    - handlersHangi guaranteediçinde yürütmek order attached;


20

Vaatlerin en iyi çözüm olduğu bir sorunu ele aldım ve yararlı olması durumunda bu soruya rastlayan herkes için burada paylaşıyorum (bu tam olarak daha önce aradığım cevaptı):

Bir Angular2 projesinde, bazı parametreleri alan ve bir formdaki açılır menüleri doldurmak için bir değer listesi döndüren bir hizmetim var. Form bileşeni başlatıldığında, bir dizi farklı açılır menü tanımlamak için aynı hizmeti farklı parametrelerle birden çok kez çağırmam gerekir, ancak hizmeti çağırmak için tüm değişkenleri sıraya koyarsam, yalnızca sonuncusu başarılı olur ve geri kalan hata dışarı. Veritabanından getirilen hizmet aynı anda yalnızca bir isteği işleyebilir.

Tüm açılır menü değişkenlerini başarıyla doldurmanın tek yolu, hizmeti yeni bir isteğin son istek tamamlanana kadar işlenmesini engelleyecek şekilde çağırmaktı ve Promise / .then mekanizması sorunu güzel bir şekilde çözdü.

  fetchValueList(listCode): Promise<any> {
      return this.dataSvc.getValueList(listCode, this.stateSvc.currentContext, this.stateSvc.currentLanguageCode)
          .map(response => response.json())
          .toPromise();
  }

  initializeDropDowns() {
      this.fetchValueList('First-Val-List')
          .then(data => {
              this.firstValList = data;
              return this.fetchValueList('Second-Val-List')
          }).then(data => {
              this.secondValList = data;
              return this.fetchValueList('Third-Val-List')
          }).then(data => {
              this.thirdValList = data;
          })  }

Bileşendeki işlevleri tanımladım ve sonra ngOnInit'te initializeDropDowns () olarak adlandırdım.

FetchValueList işlevi bir Promise döndürür, böylece ilk çağrı ilk listCode'u geçer ve Promise çözümlendiğinde, dönüş değeri .then bloğundaki veri değişkeninde bu.firstValList değişkenine atayabileceğimiz yerdir. İşlev veri döndürdüğünden, hizmetin bittiğini biliyoruz ve ikinci listCode ile tekrar aramak güvenli, dönüş değeri sonraki .then bloğundaki veri değişkeninde ve bunu this.secondValList değişkenine atarız.

Bunu tüm değişkenleri doldurmak için gerektiği kadar zincirleyebiliriz ve son kod bloğunda return ifadesini atlıyoruz ve blok sonlanıyor.

Bu, bileşen başlatıldığında birden çok kez çağrılması gereken tek bir hizmetimizin olduğu ve hizmetin tekrar çağrılmadan önce getirmesini tamamlaması ve bir değer döndürmesi gereken çok özel bir kullanım durumudur, ancak bu durumda, Promise / .then yöntemi idealdir.


3
Bu kesinlikle (yüksek dereceli) gözlemlenebilirlerle mümkündür. Örneğin scan(), ardışık gözlemlenebilir bir akış oluşturmak için kullanabilirsiniz . Ancak yaklaşımınız belki daha açık ve anlaşılması daha kolaydır.
lex82

1
"Sonra" yı "switchMap" ile değiştirebilir ve aynı şeyi gözlemlenebilir öğelerle yapabilirsiniz.
Dr.C. Hilarius

1
SwitchMap ile ilgili sorun, anladığım kadarıyla, tüm istekleri paralel olarak başlatacak ve hepsi geri dönene kadar bekleyecek, daha sonra değerleri çağrı işlevine döndürecekken, benim durumumda, yapamayacağım tek bir sunucum var paralel olarak birden çok kez çağırın (sunucu yenileri geldiğinde bitmemiş istekleri bırakacağı için), bu yüzden yeni bir çağrı başlamadan önce veritabanı hizmetine yapılan her çağrının tamamlandığından emin olmak zorunda kaldım ve Promise / sonra en iyi gibi görünüyordu belki de bunu çözmenin tek yolu.
Stephen R. Smith

1
Neden zincirleme mergeMap kullanmadınız? Kodunuzu anladığım kadarıyla, bu oldukça basit ve işinizi örnek kadar iyi yapıyor. @ StephenR.Smith
Ore

1
@ Cevabı Başka bir yanıtla aynı sorunu çözmenin kod örneğini ekleyebilir misiniz? İyi bir referans olur ve gelecekte iyi bir yeniden düzenleme fırsatı olabilir. Gereksinim, kod ne olursa olsun, arka uç servisini paralel olarak çağıramazsa, çağırması, dönüş değerini beklemesi ve tekrar çağırması gerekir.
Stephen R. Smith

20

Diğer tüm cevapların şüphelerinizi gidermesi gerektiğine inanıyorum. Bununla birlikte, gözlemlenebilirlerin fonksiyonel programlamaya dayandığını eklemek istedim ve harita, flatmap, azaltma, zip gibi beraberinde gelen işlevleri çok kullanışlı buluyorum. Web'in özellikle API isteklerine bağlı olduğu zaman elde ettiği tutarlılık acımasız bir gelişmedir.

Bu belgeyi şiddetle tavsiye ediyorum , çünkü bu reaktifX'in resmi belgeleri ve en açık olduğunu düşünüyorum.

Gözlemlenebilir olmak istiyorsanız, bu 3 bölümlü gönderiyi öneririm: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/

RxJava için tasarlanmış olsa da, kavramlar aynıdır ve gerçekten iyi açıklanmıştır. ReativeX belgelerinde, her fonksiyon için denkliklere sahipsiniz. RxJS'yi aramalısınız.


18

Söz vermek:

  • Tek bir gelecekteki değer sağlayın;
  • Tembel değil;
  • İptal edilemez;

gözlemlenebilir:

  • Zaman içinde birden çok değer yayar;
  • Tembel;
  • iptal;
  • Harita, filtre, azaltma ve benzer operatörleri destekler

İsterseniz Açısal'da HTTP çağırırken gözlemlenebilir yerine vaat kullanabilirsiniz.


16

Genel bakış:

  • Hem Sözler hem de Gözlemlenebilirler asenkron işlemlerle uğraşmamıza yardımcı olur. Bu eşzamansız işlemler yapıldığında belirli geri çağrıları çağırabilirler.
  • Bir Söz yalnızca bir olayı işleyebilir, Gözlemlenebilirler zaman içindeki olayların akışı içindir
  • Vaatler beklemeden iptal edilemez
  • Yayılan Veri Gözlemlenebilirliği operatörleri kullanılarak dönüştürülebilir

Gözlemlenebilir bir sözün sunduğu tüm işlevlere (+ ekstra) sahip olduğundan, her zaman eşzamansız davranışlarla uğraşmak için bir gözlemlenebilir kullanabilirsiniz. Ancak, bazen Gözlenebilirlerin sunduğu bu ekstra işlevselliğe ihtiyaç duyulmaz. Daha sonra bunları kullanması için bir kütüphaneyi içe aktarmak ek yük olurdu.

Promises ne zaman kullanılır:

Sonucu işlemek istediğiniz tek bir zaman uyumsuz işleminiz varsa vaatleri kullanın . Örneğin:

var promise = new Promise((resolve, reject) => {
  // do something once, possibly async
  // code inside the Promise constructor callback is getting executed synchronously

  if (/* everything turned out fine */) {
    resolve("Stuff worked!");
  }
  else {
    reject(Error("It broke"));
  }
});

//after the promise is resolved or rejected we can call .then or .catch method on it

promise.then((val) => console.log(val))      // logs the resolve argument
       .catch((val) => console.log(val));    // logs the reject argument

Böylece bir söz, kodu çözdüğü veya reddettiği bazı kodları yürütür. Ya kararlılığının veya bir gider söz denir reddetmek bekleme durumunda ya bir karşı çözülmesi veya reddedilen devlet. Vaat durumu çözüldüğünde then()yöntem çağrılır. Vaat durumu reddedildiğinde,catch() yöntem çağrılır.

Gözlemlenebilirler ne zaman kullanılır:

Zaman içinde işlenmesi gereken bir veri akışı olduğunda ( Gözlenebilir) Gözlemlenebilir öğelerini kullanın . Akış, zaman içinde kullanıma sunulan bir dizi veri öğesidir . Akış örnekleri:

  1. Kullanıcı olayları, örneğin tıklama veya anahtarlama olayları. Kullanıcı zaman içinde olaylar (veriler) üretir.
  2. Websockets, istemci sunucuya WebSocket bağlantısı kurduktan sonra verileri zaman içinde iletir.

Gözlemlenebilir öğesinde, bir sonraki olay gerçekleştiğinde, bir hata oluştuğunda veya Gözlemlenebilir tamamlandığında belirtilir . Daha sonra, onu aktive eden bu gözlemlenebilirliğe abone olabiliriz ve bu abonelikte, 3 geri arama gönderebiliriz (her zaman hepsini geçmek zorunda değilsiniz). Başarı için bir geri arama, bir hata geri arama ve bir tamamlama için geri arama. Örneğin:

const observable = Rx.Observable.create(observer => {
  // create a single value and complete
  observer.onNext(1);
  observer.onCompleted();
});

source.subscribe(
  x => console.log('onNext: %s', x),   //  success callback
  e => console.log('onError: %s', e),  //  error callback
  () => console.log('onCompleted')     //  completion callback
 );

// first we log: onNext: 1
//  then we log: onCompleted

Bir gözlemlenebilir oluştururken, bir gözlemciyi bağımsız değişken olarak sağlayan bir geri çağırma işlevi gerektirir. Bu gözlemci üzerinde, daha sonra arayabilir onNext, onCompleted, onError. Sonra Gözlemlenebilir abone olunca, aboneliğe aktarılan karşılık gelen geri çağrıları çağırır.


9

Promise - Gelecekte tek bir değer sağlayın. Tembel değil . İptal edilemez. Ya reddedilecek ya da çözülecektir.

Gözlenebilir - Gelecekteki birden çok değeri sağlayın. Tembel. İptal edilebilir. Diğer yöntemler canlı harita sağlamak, filtre, azaltmak.


8

Promise vs Gözlemlenebilir benzerlik önce

  1. Her ikisi de zaman uyumsuz kodu işlemek için kullanılır.
  2. Lütfen söz örneğine bakın. Promise yapıcısı, bazı eşzamansız görevlerin tamamlanmasının ardından bir değerle çağrıldığında çağrılacak bir çözüm başvuru işlevini iletir.

const promise = new Promise(resolve => {
  setTimeout(() => {
    resolve("Hello from a Promise!");
  }, 2000);
});

promise.then(value => console.log(value));

  1. Şimdi gözlemlenebilir örnek. Burada ayrıca, zaman uyumsuz görevi yerine getirecek bir gözlemci olan gözlemlenebilir bir işlev geçiririz. Sözdeki çözümü aksine, aşağıdaki yöntem ve o zaman yerine abone olur.

  2. Yani her ikisi de zaman uyumsuz görevleri idare eder. Şimdi farkı görelim.


const observable = new Observable(observer => {
  setTimeout(() => {
    observer.next('Hello from a Observable!');
  }, 2000);
});

observable.subscribe(value => console.log(value));

Promise vs Gözlemlenebilir fark

Söz vermek

  1. Tek bir değeri çözer veya reddeder ve tek seferde tek değerli bir zaman uyumsuz görevi işleyebilir.
  2. Bir söz bir kez tamamladığı zaman uyumsuzluk değerini çözdü, artık kullanılamaz. Sadece bir kerelik kullanımda ve burada yetersiz kalıyor.
  3. İptal edilemez
  4. Operatörler için rxjs desteği yok.

izlenebilir

  1. çoklu eşzamansız değerler yayma yeteneği.
  2. Olayların veya değerlerin akışını işlemek için kullanılır. Çok sayıda görev veya değerden oluşan bir diziniz olduğunu ve buna her değer girildiğinde bunun otomatik olarak ele alınmasını istediğinizi düşünün. Bu diziye bir değer eklediğinizde, tüm aboneleri en son değeri otomatik olarak alır.
  3. Gözlemlenebilir girişler, tekrarlanan aralık, tüm alt bileşenlere yayın değerleri, web soketi push bildirimleri vb.
  4. Abonelikten çıkma yöntemi kullanılarak her zaman iptal edilebilir.
  5. Sahip olduğu vaat edilen bir başka son iyi bölüm de rxjs operatörleri için destek. Abone olmadan önce gözlemlenebilir verileri dönüştürmek için büyük ölçüde harita, filtre, switchMap, combineLatest vb. Birçok boru operatörünüz var.

resim açıklamasını buraya girin



6

Hem Sözler hem de Gözlemlenebilirler asenkron işlemlerle uğraşmamıza yardımcı olur. Bu eşzamansız işlemler yapıldığında belirli geri çağrıları çağırabilirler.

Açısal HTTP ile uğraşma vaatleri yerine RxJS'den gelen Gözlemlenebilirler kullanır

Below are some important differences in promises & Observables.

Vaatler ve Gözlenebilirler arasındaki fark



1
Lütfen yayınınızı düzenleyin ve gerçek içeriği ekran görüntüsü yerine metin olarak gösterin. Diğerleri resimlerinizden kopyalayıp yapıştıramaz. Ayrıntılar için buraya bakın. Teşekkür ederim.
Pang

6

Bir Promise, zaman uyumsuz bir etkinlik bittiğinde veya başarısız olduğunda tek bir olay yayar.

Gözlemlenebilir bir Akış gibidir (birçok dilde) ve her olay için geri aramanın gerekli olduğu yerlerde en az sıfır veya daha fazla olayı geçirmeye izin verir.

Promise ve daha fazlasını vurguladığı için Promise yerine Sık Gözlemlenebilir tercih edilir. Gözlemlenebilir ile 0, 1 veya çeşitli olayları ele almanızın önemi yoktur. Her vaka için benzer API'yı kullanabilirsiniz.

Promise: promise tek bir değer yayar

Örneğin:

const numberPromise = new Promise((resolve) => {
    resolve(5);
    resolve(10);
});

numberPromise.then(value => console.log(value));
// still prints only 5

Gözlenebilir: Belirli bir süre içinde birden çok değer yayar

Örneğin:

  const numberObservable = new Observable((observer) => {
        observer.next(5);
        observer.next(10);
    });

numberObservable.subscribe(value => console.log(value));
// prints 5 and 10

bir süre boyunca birden fazla değer yayan bir akış gibi düşünülebilir ve yayılan her öğe için aynı geri çağırma işlevi çağrılır, böylece gözlemlenebilir bir şekilde eşzamansız verileri işlemek için aynı API'yi kullanabiliriz. bu verilerin bir süre boyunca tek bir değer veya birden fazla değer olarak iletilmesi.

Söz vermek:

  • Bir söz Tembel Değil
  • Bir Söz iptal edilemez

gözlemlenebilir:

  • Gözlenebilir tembel. "Gözlenebilir" yavaştır. Abone olana kadar çağrılmaz.
  • Gözlemlenebilir, unsubscribe () yöntemi kullanılarak iptal edilebilir
  • Gözlemlenebilir bir ek, harita, foreach, filtre, azaltma, yeniden deneme, yeniden deneme gibi birçok güçlü işleç sağlar.

Açısal Vaatler ve Gözlenebilirler


5

Promise tek bir değer verirken, Gözlenebilir birden çok değer yayar. Bu nedenle, bir HTTP isteğini işlerken Promise aynı istek için tek bir yanıtı yönetebilir, ancak aynı talebe birden fazla yanıt varsa, Gözlemlenebilir'i kullanmamız gerekir. Evet, Gözlemlenebilir aynı istek için birden çok yanıtı işleyebilir.

Söz vermek

const promise = new Promise((data) =>
{ data(1);
  data(2);
  data(3); })
.then(element => console.log(‘Promise ‘ + element));

Çıktı

Promise 1

izlenebilir

const observable = new Observable((data) => {
data.next(1);
data.next(2);
data.next(3);
}).subscribe(element => console.log('Observable ' + element));

Çıktı

Observable 1
Observable 2
Observable 3

3

Aşağıda vaatlerde ve Gözlenebilirlerde bazı önemli farklılıklar bulunmaktadır.

Söz vermek

  • Yalnızca tek bir değer yayar
  • İptal edilemez
  • Paylaşılamaz
  • Daima eşzamansız

izlenebilir

  • Birden çok değer yayar
  • Yalnızca çağrıldığında veya biri abone olduğunda çalışır
  • İptal edilebilir
  • Bu paylaşılan değeri birden fazla abone tarafından paylaşılabilir ve abone olabilir. Ve tüm aboneler tek bir zamanda çalışacak.
  • muhtemelen eşzamansız

Daha iyi anlamak için https://stackblitz.com/edit/observable-vs-promises adresine bakın.


3

Observable'ın "iptal edilebilir" olduğu iddiasını kullanan birçok insan görüyorum, ancak Promise'i "iptal edilebilir" hale getirmek oldukça önemsiz

function cancellablePromise(body) {
  let resolve, reject;
  const promise = new Promise((res, rej) => {
    resolve = res; reject = rej;
    body(resolve, reject)
  })
  promise.resolve = resolve;
  promise.reject = reject;
  return promise
}

// Example 1: Reject a promise prematurely
const p1 = cancellablePromise((resolve, reject) => {
  setTimeout(() => resolve('10', 100))
})

p1.then(value => alert(value)).catch(err => console.error(err))
p1.reject(new Error('denied')) // expect an error in the console

// Example: Resolve a promise prematurely
const p2 = cancellablePromise((resolve, reject) => {
  setTimeout(() => resolve('blop'), 100)
})

p2.then(value => alert(value)).catch(err => console.error(err))
p2.resolve(200) // expect an alert with 200


2

Kısa cevap :

Gözlemlenebilir daha iyidir , tüm Promises özelliklerine ve ekstra özelliklere sahiptir.


Uzun cevap:

sözler:

  • Bir Kez "Verileri bir kez döndür" seçeneğini kullanın
  • İptal yok
  • Bir dinleyici
  • Soket Desteği Yok Bir Dinleyici

gözlemlenebilir:

  • Veri değiştikçe Verileri birçok kez döndürün
  • Destek iptali
  • Destek soketi
  • Birçok Dinleyiciyi destekleyin ve veri değiştiğinde onları bilgilendirin
  • Destek haritası, filtre, azaltmak

Gözlemlenebilirlerin objektif olarak daha iyi olduğunu söyleyebileceğinizi sanmıyorum. Buradaki çeşitli cevaplarda Gözlemlenebilirlerin dezavantajları vardır. Bana göze çarpanlar, Observable'ın karmaşıklığıdır ve doğrudan beklemede / async ile çalışmazlar. Şahsen onları çalışmak gerçekten zor buluyorum çünkü bir Gözlemlenebilir davranışını kullanırken belirleyemezsiniz - onu oluşturan koda bakmanız gerekir. Bir Söz ile her zaman nasıl çalıştıklarını tam olarak bilirsiniz. Örneğin, bazen bir Gözlemlenebilir öğeye abone olmanın yan etkileri vardır (örneğin bir http isteği), ancak bazen olmayabilir.
Yona Appletree

Açısal için, durumunuza bağlıdır. çoğu durumda farklı yerler, prizler, iptal, harita, filtreleme ve azaltmayı etkileyecek hizmetler ve bazı verilerle çalışacağız. bu yüzden söz konusu davaları desteklemeyen sözler olarak daha iyi olacaktır. yine sizin durumunuza bağlı
Amr Ibrahim

2

Kabul edilen cevap genel olarak iyi olsa da, Açısal Bileşenlerle uğraşırken neredeyse her zaman bir Gözlemlenebilir kullanmak istediğinizi vurguladığını düşünmüyorum çünkü iptal işlemini destekliyor. Vaatler iptal edilemez ve bileşeniniz yok edilse bile çözülür. Açısal olana kadar affetme eğilimindedir.

Örneğin, yok edilen bir bileşendeki herhangi bir manuel değişiklik algılaması bir istisnaya neden olur:

ngOnInit() {
  // promise api
  this.service.getData().then(d => {
     this.data = d;
     this.changeDetectorRef.detectChanges();
  });

  // observable api
  this.service.getData().pipe(takeUntil(this.unsubscribe)).subscribe((d) => {
     this.data = d;
     this.changeDetectorRef.detectChanges();
  });
}

Sözün çözülmeden önce bileşeniniz imha edilirse, attempt to use destroyed view hata .

Alternatif olarak, takeUntil ile gözlenebilirler kullanıyorsanız deseniyle , bileşeniniz yok edilir abonelik iptal edilir.

Bu biraz tartışmalı bir örnektir, ancak yok edilen bir bileşen için kod yürütmek muhtemelen hatalara yol açacaktır. Aslında bunu bir nedenden dolayı yapmak istemiyorsanız: p


2

Ben öğretici ve dokümanlar ilk okumasından belli değildi içine girdi bir şey çok noktaya yayın fikri oldu.

Varsayılan olarak, birden çok aboneliğin bir Gözlenebilir'de birden çok yürütmeyi tetikleyeceğini bildiğinizden emin olun. Tek bir HTTP çağrısına birden çok abonelik Gözlemlenebilir, siz aynı sürece birden çok özdeş HTTP çağrısını tetikler.share() (çoklu yayını etkinleştirmediğiniz .

Bir söz sizi bir seferde tek bir şeyle uğraşmaya, verilerini açmaya, istisnaları ele almaya, asenkron / beklemek gibi havalı şeyler için dil desteğine sahip olmaya zorlar ve aksi takdirde oldukça barebone olur.

Bir Gözlemlenebilir'de çok sayıda çan ve ıslık bulunur, ancak birlikte çalıştığınız gücü anlamanız gerekir veya yanlış kullanılabilir.


2

Söz vermek:

Eşzamansız Olay İşleyici - Promise nesnesi, eşzamansız bir işlemin nihai tamamlanmasını (veya başarısızlığını) ve sonuç değerini temsil eder.

Sözdizimi: yeni Promise (yürütücü);

Örneğin:

var promise_eg = new Promise(function(resolve, reject) {
  setTimeout(function() {
    resolve('foo');
  }, 300);
});

promise_eg.then(function(value) {
  console.log(value);
  // expected output: "foo"
});

console.log(promise_eg);

resim açıklamasını buraya girin

Promise Hakkında: Bir boru hattı vardır, bu yüzden çağrıldığında sadece bir kez değer döndürür. onun tek yönlü işleyici denilen bir kez iptal edemeyebilirsiniz. zaman () ve sonra () oynayabileceğiniz yararlı sözdizimi

gözlenebilirler:

Gözlemlenebilirler, zaman içinde birden çok değerin tembel koleksiyonlarıdır. asenkron işlemler için gerçekten harika bir yaklaşım. açısal / tepki vb. ile kullanılabilen çapraz platform desteğine sahip rxjs ile yapılabilir .

akış astarı gibi davranır. çoklu boru hattı olabilir. bir kez tanımlandıktan sonra birçok yerde iade sonuçları almak için abone olabilirsiniz.

Sözdizimi: import * as Rx from "@reactivex/rxjs"; başlatmak için:

Rx.Observable.fromEvent(button, "click"),
Rx.Subject()

vb

Abone olmak için: RxLogger.getInstance();

Örneğin:

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

range(1, 200).pipe(
  filter(x => x % 2 === 1),
  map(x => x + x)
).subscribe(x => console.log(x));

çoklu boru hattını desteklediğinden, sonucu farklı konumlarda abone olabilirsiniz, resim açıklamasını buraya girin vaatlerden çok olasılıkları vardır.

Kullanım: gibi daha fazla olasılık vardırmap, filter, pipe, map, concatMap etc


2

Gözlenebilir ve vaatler arasındaki temel fark:

resim açıklamasını buraya girin


2
Lütfen yayınınızı düzenleyin ve gerçek içeriği ekran görüntüsü yerine metin olarak gösterin. Diğerleri resimlerinizden kopyalayıp yapıştıramaz. Ayrıntılar için buraya bakın. Teşekkür ederim.
Pang

1

Gözlemlenebilirler genellikle vaatlerle karşılaştırılır. İşte bazı önemli farklılıklar:

Gözlemlenebilirler beyan niteliğindedir; hesaplama abonelik başlayana kadar başlamaz. Vaatler hemen yaratılışta ifa edilir. Bu, gözlenebilirleri, sonuca ihtiyacınız olduğunda çalıştırılabilecek tarifleri tanımlamak için yararlı kılar.

Gözlenebilirler birçok değer sağlar. Sözler bir tane sağlar. Bu, gözlemlenebilirleri zaman içinde birden çok değer elde etmek için yararlı kılar.

Gözlemlenebilirler zincirleme ve abonelik arasında ayrım yapar. Vaatlerde sadece .then () cümleleri vardır. Bu, gözlemlenebilir işleri, çalışmanın yürütülmesine neden olmadan, sistemin diğer bölümleri tarafından kullanılacak karmaşık dönüşüm tarifleri oluşturmak için yararlı kılar.

Gözlemlenebilirlik abone () hataların işlenmesinden sorumludur. Çocuk sözlerine itme hataları vaat ediyor. Bu, gözlemlenebilirleri merkezi ve öngörülebilir hata işleme için yararlı kılar.

ANGULAR.IO belgelerinde bulabileceğiniz en basit fark budur. dinlenme cevap çoğu tarafından verilir kendi yerinde doğru


1
  1. Vaatler sadece tek değerler veya çözümlere odaklanır, gözlemlenebilir veri akışıdır.

  2. Gözlemlenebilirler iptal edilebilir, ancak vaatler iptal edilemez.

En az bilinen, benim için en az

  1. Vaatler her zaman eşzamansızdır, ancak gözlemlenebilir eşzamanlı ve eşzamansız olabilir.

0
  1. bir söz istekliyken gözlemlenebilir bir tembeldir,
  2. Bir Vaat her zaman eşzamansız iken Gözlemlenebilir eşzamanlı veya eşzamansız olabilir,
  3. Bir Vaat tek bir değer sağlayabilirken, bir Gözlemlenebilir
    akışıdır (0'dan birden çok değere),
  4. yeni uyarlanmış bir akış elde etmek için bir Gözlenebilir'e RxJS operatörleri uygulayabilirsiniz.

-1

Gözlemlenebilirler ve Vaatler, JavaScript / daktilodaki eşzamansız işlevlerle çalışmamıza yardımcı oluyor. Birçok durumda çok benzerler, ancak aralarında hala bazı farklılıklar vardır.

resim açıklamasını buraya girin


1
Lütfen yayınınızı düzenleyin ve ekran görüntüleri yerine gerçek metni gösterin. Diğerleri resimlerinizden kopyalayıp yapıştıramaz. Ayrıntılar için buraya bakın. Teşekkür ederim.
Pang

Kod değil düz bilgi hariç, bu yüzden bir görüntü olarak göndermek için sorun yok
Alator

1
Kudvenkat'ın youtube videolarından yapıştırma işlemini durdurun. Benden alçalt! :)
Pratik

-2

Bu konuda zaten çok sayıda cevap var, bu yüzden gereksiz bir tane eklemem.

Ancak, Gözlemlenebilir / Açısal öğrenmeye yeni başlayan birine ve hangisinin Promise ile karşılaştırılacağını merak edenlere, her şeyi Gözlemlenebilir tutmanızı ve projenizdeki tüm Vaatleri Gözlemlenebilir hale getirmenizi tavsiye ederim.

Çünkü Açısal çerçevenin kendisi ve toplulukları Gözlemlenebilir'i kullanıyor. Bu nedenle, çerçeve hizmetlerini veya 3. taraf modüllerini entegre ettiğinizde ve her şeyi bir araya getirdiğinizde faydalı olacaktır.


Tüm downvotes takdir ederken, ancak Birisi Gözlenebilir Projeler üzerinde Gözlenebilirler için Vaat kullanmak için yararlı olabilecek birkaç senaryoyu listelemek için uygun bir yorum yapmadıkça yukarıdaki fikrimde ısrar ediyorum.

Tabii ki, hiçbir görüş her durumda% 100 doğru değildir, ancak en azından açısal çerçevede uygulanan düzenli ticari projeler için zamanın% 98'ini düşünüyorum, Gözlemlenebilir doğru yol.

Basit hobi projenizin başlangıç ​​noktasında beğenmeseniz bile, yakında Angular'da etkileşime girdiğiniz neredeyse tüm bileşenlerin farkına varacaksınız ve Açısal dostu 3. taraf çerçevesinin çoğunda Gözlenebilirler kullanılıyor ve ardından Sonunda sürekli onlarla iletişim kurmak için Sözünüzü Gözlenebilir hale dönüştürdü.

Bu bileşenler aşağıdakileri içerir ancak bunlarla sınırlı değildir: HttpClient, Form oluşturucu, Açısal malzeme modülleri / iletişim kutuları, Ngrx mağazası / efektleri ve ngx-bootstrap.

Aslında, son 2 yılda ele aldığım açısal eko-sistemden tek Promise APP_INITIALIZER.

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.