Angular Promise
ve Observable
angular 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?
Angular Promise
ve Observable
angular 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?
Yanıtlar:
Söz vermek
Bir zaman uyumsuz işlem tamamlandığında veya başarısız olduğunda tek bir olayıPromise
işler .
Not: Promise
Dışarıda iptal işlemini destekleyen kütüphaneler var, ancak ES6 Promise
şu ana kadar değil.
izlenebilir
An Observable
bir 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 Observable
tercih edilir . İle Eğer 0, 1 veya birden fazla olayları ele istiyorsanız bunun önemi yoktur. Her durumda aynı API'yı kullanabilirsiniz.Promise
Promise
Observable
Observable
ayrı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ğlarSubscription
Observable
Promise
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
, reduce
bir diziye benzer ...
Ayrıca retry()
, ya da replay()
... gibi , genellikle oldukça kullanışlı olan güçlü operatörler de vardır .
Promise
, unutmayın async
/ await
kodunuzu 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
/ await
Bugün transistörler ile kullanabilirsiniz ve kazan plakası TypeScript
olmadan insan tarafından okunabilir gerçek düz kodu yazabilirsiniz rxjs
. Muhtemelen rxjs
bazen belirli durumlarda ihtiyacınız olacaktır , çünkü gerçekten sunacak çok şey var.
Hem Promises
ve Observables
bizi 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.
HTTP
. Temel olarak, yalnızca kullanıcı her tuş vuruşu yerine yazmayı bıraktığında vurmak istiyoruz.Demo sadece iki dosyadan oluşacaktır: app.ts
ve 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 Jsonp
hizmeti 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.GET
toPromise
Observable<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 WikipediaService
bir 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 formControl
yönergesinden yararlanabiliriz. Bu yönergeyi kullanmak için, öncelikle ReactiveFormsModule
uygulama 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 FormControl
dan@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 valueChanges
abone 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, distinctUntilChanged
aradı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
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ı asynchronous
gibi çö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:
gözlemlenebilir:
Ayrıca, farklılıkları görsel olarak göstermek için aşağıdaki grafik görüntüsünü oluşturdum:
Promise
, sözlerin nasıl verildiğini düşünmenin yanlış yoludur. Promise
Eş 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
sözler
gözlenebilirler
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.
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'?
Vaatler ve Gözlemlenebilirler her ikisi de yalnızca eşzamansız çağrıyı yönetir.
Aralarındaki farklar:
izlenebilir
Söz vermek
Bir seferde yalnızca tek bir değer yayar
Hizmetleri .then ve .catch olmadan çağırır
İptal edilemez
Operatör sağlamaz
Bu cevap gecikmiş olsa da, aşağıdaki farkları özetledim,
gözlemlenebilir:
function
alır an observer
ve duruma göre bir function Observer: an object with next, error.
subscribe/unsubscribe
veri akışına izin verir , gözlemciye bir sonraki değer yayar notify
, gözlemci hakkında errors
ve gözlemciyistream completion
function to handle next value
, hatalar ve akış sonu sağlar (ui olayları, http yanıtları, web soketli veriler).multiple values
üzerinde zamancancel-able/retry-able
gibi operatörleri destekler ve destekler map,filter,reduce
.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 olabilirSöz :
Bir söz, gelecekte bitecek bir görevi temsil eder;
Vaatler olur resolved by a value
;
Vaatler istisnalarla reddedilir;
Değil cancellable
ve geri dönera single value
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 attachment
dayalı olarak yürütülür:
state
;
- handlers
Hangi guaranteed
içinde yürütmek order attached
;
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.
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.
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.
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.
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.
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:
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.
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.
const promise = new Promise(resolve => {
setTimeout(() => {
resolve("Hello from a Promise!");
}, 2000);
});
promise.then(value => console.log(value));
Ş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.
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));
Söz vermek
izlenebilir
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.
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:
gözlemlenebilir:
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
Aşağıda vaatlerde ve Gözlenebilirlerde bazı önemli farklılıklar bulunmaktadır.
Söz vermek
izlenebilir
Daha iyi anlamak için https://stackblitz.com/edit/observable-vs-promises adresine bakın.
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
Kısa cevap :
Gözlemlenebilir daha iyidir , tüm Promises özelliklerine ve ekstra özelliklere sahiptir.
Uzun cevap:
sözler:
gözlemlenebilir:
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
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.
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);
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, vaatlerden çok olasılıkları vardır.
Kullanım:
gibi daha fazla olasılık vardırmap, filter, pipe, map, concatMap etc
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
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.
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
.