a(function (resultsFromA) {
b(resultsFromA, function (resultsFromB) {
c(resultsFromB, function (resultsFromC) {
d(resultsFromC, function (resultsFromD) {
e(resultsFromD, function (resultsFromE) {
f(resultsFromE, function (resultsFromF) {
console.log(resultsFromF);
})
})
})
})
})
});
Барномасозии асинхронӣ, ки мо онро дар JavaScript медонем, танҳо аз рӯи функсияҳо амалӣ кардан мумкин аст. Онҳо метавонанд мисли ҳар як тағирёбанда ба дигар функсияҳо интиқол дода шаванд. Ҳамин тавр зангҳои бозгашт ба вуҷуд омадаанд. Ва он сард, шавқовар ва бозича аст, то он даме, ки ба ғамгинӣ, ғамгинӣ ва ғамгинӣ табдил ёбад. Чаро? Ин оддӣ аст:
Бо зиёд шудани мураккабии код, лоиҳа зуд ба блокҳои норавшан ва такроран лона табдил меёбад - "ҷаҳаннам бозхонд".
Муносибати хато метавонад ба осонӣ аз даст дода шавад.
Шумо наметавонед ифодаҳоро бо бозгашт баргардонед.
Бо пайдоиши ваъда вазъият каме беҳтар шуд.
new Promise(function(resolve, reject) {
setTimeout(() => resolve(1), 2000);
}).then((result) => {
alert(result);
return result + 2;
}).then((result) => {
throw new Error('FAILED HERE');
alert(result);
return result + 2;
}).then((result) => {
alert(result);
return result + 2;
}).catch((e) => {
console.log('error: ', e);
});
Занҷирҳои ваъдашуда пайдо шуданд, ки хониши кодро беҳтар карданд
Усули алоҳида барои дарёфти хатоҳо пайдо шуд
Имконияти иҷрои мувозӣ бо Promise.all илова карда шуд
Мо метавонем асинхронии лонаро бо истифода аз async/await ҳал кунем
Аммо ваъдаҳо маҳдудиятҳои худро доранд. Масалан, ваъдаро бе рақс бо танбур бекор кардан мумкин нест ва муҳимтар аз ҳама он аст, ки он бо як арзиш кор мекунад.
Ҷараён массиви маълумотест, ки аз рӯи вақт мураттаб шудаанд, ки метавонанд нишон диҳанд, ки маълумот тағир ёфтааст. Акнун тасаввур кунед, ки навиштани код то чӣ андоза қулай аст, ки дар он як амал даъвати якчанд ҳодисаро дар қисмҳои гуногуни код талаб мекунад. Мо танҳо ба ҷараён обуна мешавем ва он вақте ки тағирот рух медиҳад, моро огоҳ мекунад. Ва китобхонаи RxJs ин корро карда метавонад.
RxJS китобхона барои кор бо барномаҳои асинхронӣ ва рӯйдодҳо бо истифода аз пайдарпайии мушоҳидашаванда аст. Китобхона як намуди асосиро пешниҳод мекунад Мушоҳидашаванда, якчанд намуди ёрирасон (Нозир, Барномасозон, Субъектҳо) ва операторҳо барои кор бо рӯйдодҳо мисли коллексияҳо (харита, филтр, кам кардан, ҳар ва монанди инҳо аз JavaScript Array).
Биёед мафҳумҳои асосии ин китобхонаро фаҳмем.
Мушоҳидашаванда, нозир, истеҳсолкунанда
Мушоҳидашаванда аввалин намуди асосӣест, ки мо онро дида мебароем. Ин синф қисми асосии татбиқи RxJs-ро дар бар мегирад. Он бо ҷараёни мушоҳидашаванда алоқаманд аст, ки метавонад бо истифода аз усули обуна обуна шавад.
Муносибати як ба бисёрро истифода мебарад
Муносибати як ба якро истифода мебарад
Ҳама обунаҳо як маъно доранд
Обунаҳо мустақиланд
Агар шумо обуна надошта бошед, маълумот метавонад гум шавад
Ҳама арзишҳои ҷараёнро барои обунаи нав дубора нашр мекунад
Барои мисол, ман як ҷараёни гармро ҳамчун филм дар театр фикр мекунам. Дар кадом ваќт омадед, аз њамон лањза ба тамошо сар кардед. Ман ҷараёни сардро бо занги техникӣ муқоиса мекардам. дастгирй мекунанд. Ҳар як зангзан сабти паёми овозиро аз аввал то ба охир гӯш мекунад, аммо шумо метавонед телефонро бо истифода аз қатъ кардани обуна гузоред.
Мехоҳам қайд намоям, ки ҷараёнҳои ба истилоҳ гарм низ ҳастанд (ман бо ин таъриф хеле кам ва танҳо дар ҷомеаҳои хориҷӣ дучор омадаам) - ин ҷараёнест, ки аз ҷараёни сард ба гарм табдил меёбад. Саволе ба миён меояд - дар куҷо истифода баред)) Ман аз амалия мисол меорам.
Ман бо 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
То он даме, ки 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 )
);
Операторҳо - combineLatest
Оператори combineLatest то андозае ба contract.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);