د یو څخه ډیری اړیکې کاروي
یو له بل سره اړیکه کاروي
ټول ګډونونه ورته معنی لري
ګډونونه خپلواک دي
ډاټا له لاسه ورکول کیدی شي که تاسو ګډون نلرئ
د نوي ګډون لپاره ټول جریان ارزښتونه بیا خپروي
د مشابهت ورکولو لپاره، زه به په تیاتر کې د فلم په توګه د ګرم جریان په اړه فکر وکړم. په کوم وخت کې چې تاسو رارسیدلي، له هغه شیبې څخه تاسو لیدل پیل کړل. زه به په ټیکنالوژۍ کې زنګ سره سړه جریان پرتله کړم. ملاتړ هر زنګ وهونکی د پیل څخه تر پای پورې د غږیز میل ثبت ته غوږ نیسي، مګر تاسو کولی شئ د غړیتوب د ختمولو په کارولو سره ځړول شئ.
زه غواړم یادونه وکړم چې د تودوخې جریان هم شتون لري (زه دا تعریف خورا لږ او یوازې په بهرنیو ټولنو کې موندلی یم) - دا یو جریان دی چې له سړې جریان څخه ګرم ته بدلیږي. پوښتنه راپورته کیږي - چیرته کارول کیږي)) زه به د تمرین څخه یو مثال ورکړم.
زه د Angular سره کار کوم. هغه په فعاله توګه rxjs کاروي. سرور ته د معلوماتو ترلاسه کولو لپاره ، زه د سړې تار تمه کوم او دا تار په ټیمپلیټ کې د asyncPipe په کارولو سره وکاروم. که زه دا پایپ څو ځله وکاروم، نو بیا، د سړې جریان تعریف ته بیرته راګرځم، هر پایپ به د سرور څخه د معلوماتو غوښتنه وکړي، کوم چې لږ تر لږه ویل عجيب دي. او که زه یو سړه جریان په تودوخې بدل کړم ، نو غوښتنه به یوځل پیښ شي.
په عموم کې، د جریان ډول پوهیدل د پیل کونکو لپاره خورا ستونزمن دي، مګر مهم دي.
متصدیانو
return this.http.get(`${environment.apiUrl}/${this.apiUrl}/trade_companies`)
.pipe(
tap(({ data }: TradeCompanyList) => this.companies$$.next(cloneDeep(data))),
map(({ data }: TradeCompanyList) => data)
);
const { Observable } = Rx;
const { debounceTime, take } = RxOperators;
Observable.create((observer) => {
let i = 1;
observer.next(i++);
// Испускаем значение раз в 1000мс
setInterval(() => {
observer.next(i++)
}, 1000);
// Испускаем значение раз в 1500мс
setInterval(() => {
observer.next(i++)
}, 1500);
}).pipe(
debounceTime(700), // Ожидаем 700мс значения прежде чем обработать
take(3)
);
چلونکي - takeWhile
ارزښتونه تر هغه وخته پورې خپروي تر څو چې ټیک غلط راستون شي، وروسته له دې چې دا د تار څخه ګډون نه کوي.
const { Observable } = Rx;
const { debounceTime, takeWhile } = RxOperators;
Observable.create((observer) => {
let i = 1;
observer.next(i++);
// Испускаем значение раз в 1000мс
setInterval(() => {
observer.next(i++)
}, 1000);
}).pipe(
takeWhile( producer => producer < 5 )
);
آپریټرونه - combinineLatest
CombineLatest آپریټر یو څه د وعدې.all سره ورته دی. دا ډیری تارونه په یو کې سره یوځای کوي. وروسته له دې چې هر تار لږترلږه یو اخراج کوي، موږ د هر یو څخه وروستي ارزښتونه د صف په بڼه ترلاسه کوو. برسېره پردې، د یوځای شوي جریانونو څخه د هر ډول اخراج وروسته، دا به نوي ارزښتونه ورکړي.
const { combineLatest, Observable } = Rx;
const { take } = RxOperators;
const observer_1 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 1000мс
setInterval(() => {
observer.next('a: ' + i++);
}, 1000);
});
const observer_2 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 750мс
setInterval(() => {
observer.next('b: ' + i++);
}, 750);
});
combineLatest(observer_1, observer_2).pipe(take(5));
چلونکي - zip
Zip - د هر تار څخه د ارزښت لپاره انتظار کوي او د دې ارزښتونو پراساس یو صف جوړوي. که ارزښت له کوم تار څخه نه وي، نو ډله به نه جوړیږي.
const { zip, Observable } = Rx;
const { take } = RxOperators;
const observer_1 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 1000мс
setInterval(() => {
observer.next('a: ' + i++);
}, 1000);
});
const observer_2 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 750
setInterval(() => {
observer.next('b: ' + i++);
}, 750);
});
const observer_3 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 500
setInterval(() => {
observer.next('c: ' + i++);
}, 500);
});
zip(observer_1, observer_2, observer_3).pipe(take(5));
چلونکي - forkJoin
forkJoin هم تارونو سره یوځای کیږي، مګر دا یوازې یو ارزښت خپروي کله چې ټولې تارونه بشپړ شي.
const { forkJoin, Observable } = Rx;
const { take } = RxOperators;
const observer_1 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 1000мс
setInterval(() => {
observer.next('a: ' + i++);
}, 1000);
}).pipe(take(3));
const observer_2 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 750
setInterval(() => {
observer.next('b: ' + i++);
}, 750);
}).pipe(take(5));
const observer_3 = Observable.create((observer) => {
let i = 1;
// Испускаем значение раз в 500
setInterval(() => {
observer.next('c: ' + i++);
}, 500);
}).pipe(take(4));
forkJoin(observer_1, observer_2, observer_3);
د موضوع کورنۍ د ګرمو جریانونو غوره بیلګه ده. دا ټولګي یو ډول هایبرډ دی چې په ورته وخت کې د کتونکي او څارونکي په توګه عمل کوي. څرنګه چې موضوع ګرمه موضوع ده، نو اړینه ده چې له هغې څخه ګډون وکړئ. که موږ د اصلي میتودونو په اړه خبرې وکړو، نو دا دي:
بل - جریان ته د نوي معلوماتو لیږد
تېروتنه - تېروتنه او د تار ختمول
بشپړ - د تار بشپړول
ګډون وکړئ - یو جریان کې ګډون وکړئ
غیر ګډون کول - د جریان څخه غړیتوب منسوخ کړئ
لکه څنګه چې د لید وړ - په څارونکي بدلول
ژمنه - په وعده بدلیږي
د مضامينو ۴۵ ډوله دي.
په لوړ غږ فکر کول
په جریان کې 4 کسان وو، مګر دا معلومه شوه چې دوی یو بل اضافه کړ. لکه څنګه چې دوی وايي، ژوند وکړئ او زده کړه وکړئ.
ساده موضوع new Subject()- د موضوعاتو تر ټولو ساده ډول. د پیرامیټونو پرته جوړ شوی. یوازې د ګډون وروسته ترلاسه شوي ارزښتونه لیږدوي.
د چلند موضوع new BehaviorSubject( defaultData<T> ) - زما په نظر، د موضوع تر ټولو عام ډول. ان پټ ډیفالټ ارزښت اخلي. تل د وروستۍ مسلې ډیټا خوندي کوي ، کوم چې د ګډون کولو پرمهال لیږدول کیږي. دا ټولګي د ګټور ارزښت میتود هم لري، کوم چې د جریان اوسنی ارزښت بیرته راګرځوي.
Replay موضوع new ReplaySubject(bufferSize?: number, windowTime?: number) - ان پټ کولی شي په اختیاري توګه د لومړي دلیل په توګه د ارزښتونو بفر اندازه واخلي چې دا به پخپله ذخیره کړي، او د دویم ځل په توګه چې موږ بدلونونو ته اړتیا لرو.
AsyncSubject new AsyncSubject() - د ګډون کولو په وخت کې هیڅ شی نه پیښیږي، او ارزښت به بیرته راستانه شي کله چې بشپړ شي. یوازې د جریان وروستی ارزښت به بیرته راشي.
د ویب ساکټ موضوع new WebSocketSubject(urlConfigOrSource: string | WebSocketSubjectConfig<T> | Observable<T>, destination?: Observer<T>) - اسناد د هغه په اړه خاموش دي او زه هغه د لومړي ځل لپاره وینم. که څوک پوهیږي چې هغه څه کوي، مهرباني وکړئ ولیکئ او موږ به یې اضافه کړو.