කෝණික Promise
සහ අතර වෙනස Observable
කුමක්ද?
අවස්ථා දෙකම තේරුම් ගැනීමට එක් එක් උදාහරණය උපකාරී වේ. එක් එක් සිද්ධිය අපට භාවිතා කළ හැක්කේ කුමන අවස්ථාවෙහිදීද?
කෝණික Promise
සහ අතර වෙනස Observable
කුමක්ද?
අවස්ථා දෙකම තේරුම් ගැනීමට එක් එක් උදාහරණය උපකාරී වේ. එක් එක් සිද්ධිය අපට භාවිතා කළ හැක්කේ කුමන අවස්ථාවෙහිදීද?
Answers:
පොරොන්දුව
ඒ Promise
හැන්ඩ්ල් වූ තනි සිදුවීමක් විට අසමකාලීක මෙහෙයුම සූර්යයා හෝ අසමත් වෙයි.
සටහන: Promise
අවලංගු කිරීමට සහාය වන පුස්තකාල එහි ඇත, නමුත් ES6 Promise
මෙතෙක් එසේ නොවේ.
නිරීක්ෂණය කළ හැකි
An (බොහෝ භාෂාවලින්) හා Observable
සමාන වන අතර Stream
එක් එක් සිදුවීම සඳහා ඇමතුම් ලබා ගැනීම කැඳවනු ලබන සිදුවීම් ශුන්ය හෝ වැඩි ගණනක් සම්මත කිරීමට ඉඩ දෙයි.
බොහෝ විට Observable
වඩා කැමති Promise
වන්නේ එය Promise
සහ තවත් බොහෝ දේ සපයන බැවිනි . සමග Observable
එය ඔබ 0, 1, හෝ බහු සිදුවීම් හසුරුවීමට කිරීමට අවශ්ය නම් කමක් නෑ. සෑම අවස්ථාවකම ඔබට එකම API භාවිතා කළ හැකිය.
Observable
අවලංගුPromise
කිරීමට වඩා වැඩි වාසියක් ඇත . සේවාදායක හෝ වෙනත් මිල අධික අසමකාලීක මෙහෙයුම සඳහා HTTP ඉල්ලීමක් ප්රතිඵලයක් තවදුරටත් අවශ්ය නොවේ නම්, ආයතනයකට ටික, ග්රාහකත්වය අවලංගු කිරීමට ඉඩ අවසානයේ ඔබ දැනුම්දීමේ අවශ්ය නැහැ විට පවා සාර්ථක අසාර්ථක callback කියනු ඇත හෝ එය තවදුරටත් සපයන ප්රති result ලය.Subscription
Observable
Promise
නිරීක්ෂණය සපයයි ක්රියාකරුවන් වැනි map
, forEach
, reduce
, ... රැසක් සමාන
බොහෝ විට තරමක් පහසු වන retry()
, හෝ replay()
, ... වැනි බලවත් ක්රියාකරුවන් ද ඇත.
Promise
සමග async
/ await
ඔබගේ කේතය පැතලි නැවත වෙයි! බොහෝ අවස්ථාවන්හිදී සහ රොකට් විද්යාව සමඟ ගනුදෙනු නොකරන ව්යාපෘති වලදී, එම බිහිසුණු කැදැලි කාර්යයන් අනවශ්ය ලෙස සංකීර්ණ ක්රමවේදයන් සමඟ ලිවීමට අවශ්ය නොවේ. ඔබට භාවිතා කල හැකි async
/ await
මෙන් transpilers අද TypeScript
, සහ ඕනෑම තොරව සැබෑ මානව කියවිය හැකි පැතලි කේතය ලියන්න rxjs
ගිනි උදුනක්. rxjs
තෝරාගත් අවස්ථාවන්හිදී ඔබට සමහර විට තවමත් අවශ්ය වනු ඇත , මන්ද එයට සැබවින්ම ඉදිරිපත් කිරීමට බොහෝ දේ ඇත.
දෙකම Promises
සහ අපගේ යෙදුම්වල අසමමුහුර්ත ස්වභාවය Observables
සමඟ කටයුතු කිරීමට අපට උපකාරී වන සාරාංශ ලබා දේ . ඔවුන් අතර වෙනස පැහැදිලිව පෙන්වා දුන්නේ @ ගුන්ටර් සහ el රේලු විසිනි.
කේත ස්නිපටයක් වචන දහසක් වටින බැවින් ඒවා පහසුවෙන් තේරුම් ගැනීමට පහත උදාහරණය හරහා යන්න.
පුදුමාකාර ලිපියට ක්රිස්ටෝෆ් බර්ග්ඩෝෆ්ට ස්තූතියි
HTTP සමඟ ගනුදෙනු කිරීම සඳහා පොරොන්දු වෙනුවට කෝණික Rx.js නිරීක්ෂණ භාවිතා කරයි.
ඔබ ටයිප් කරන විට ප්රති results ල ක්ෂණිකව පෙන්විය යුතු සෙවුම් ශ්රිතයක් ඔබ ගොඩනඟයි යැයි සිතමු . හුරුපුරුදු බව පෙනේ, නමුත් එම කර්තව්යය සමඟ එන අභියෝග රාශියක් ඇත.
HTTP
ඉල්ලීම් කුණාටුවකින් ඔවුන්ව ගංවතුරට ලක් කළ යුතුය . මූලික වශයෙන්, අපට එය පහර දීමට අවශ්ය වන්නේ පරිශීලකයා සෑම යතුරු පැදියක් වෙනුවට ටයිප් කිරීම නැවැත්වූ පසු පමණි.නිරූපණය හුදෙක් ගොනු දෙකකින් සමන්විත වේ: app.ts
සහ wikipedia-service.ts
. සැබෑ ලෝක වාතාවරණයක දී, අපි බොහෝ දුරට දේවල් තව දුරටත් බෙදන්නෙමු.
පහත දැක්වෙන්නේ විස්තර කර ඇති කිසිදු අවස්ථාවකට මුහුණ නොදෙන පොරොන්දුව මත පදනම් වූ ක්රියාත්මක කිරීමයි.
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]);
}
}
ලබා දී ඇති සෙවුම් පදයක් සමඟ විකිපීඩියා API ට එරෙහිව ඉල්ලීමක් Jsonp
කිරීමට අපි සේවාව එන්නත් කරමු . A සිට a දක්වා ලබා ගැනීම සඳහා අප අමතන බව සැලකිල්ලට ගන්න . අවසානයේදී අපගේ සෙවුම් ක්රමයේ නැවත පැමිණීමේ වර්ගය ලෙස අවසන් වේ.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);
}
}
මෙහි පුදුමයක් ද නැත. අපි අපගේ එන්නත් WikipediaService
කර එහි ක්රියාකාරිත්වය සෙවුම් ක්රමයක් හරහා අච්චුවට නිරාවරණය කරමු . අච්චුව යතුරු සහ ඇමතුම් සමඟ බැඳී ඇත search(term.value)
.
විකිපීඩියා සේවයේ සෙවුම් ක්රමය නැවත පැමිණෙන බවට පොරොන්දුවේ ප්රති result ලය අපි ලිහා, එය සරල නූල් පෙළක් ලෙස අච්චුවට නිරාවරණය කර ඇති අතර එමඟින් අපට *ngFor
එය හරහා ලූපයක් තබා අප වෙනුවෙන් ලැයිස්තුවක් ගොඩනගා ගත හැකිය.
ප්ලන්කර් මත පොරොන්දුව මත පදනම් වූ ක්රියාත්මක කිරීමේ උදාහරණය බලන්න
කොහෙද නිරීක්ෂ්ය බැබළෙනු
සෑම යතුරු පහරකින්ම අවසාන ලක්ෂ්යයට පහර නොදෙන ලෙස අපගේ කේතය වෙනස් කරමු, නමුත් පරිශීලකයා 400 එම්එස් සඳහා ටයිප් කිරීම නැවැත්වූ විට පමණක් ඉල්ලීමක් එවන්න.
එවැනි සුපිරි බලයන් එළිදැක්වීම සඳහා අප විසින් පළමුව Observable<string>
පරිශීලකයා ටයිප් කරන සෙවුම් පදය ලබා ගත යුතුය. යතුරු සිද්ධියට අතින් බැඳීම වෙනුවට, අපට කෝණික formControl
නියෝගයෙන් ප්රයෝජන ගත හැකිය . මෙම විධානය භාවිතා කිරීම සඳහා, අපි පළමුව ReactiveFormsModule
අපගේ යෙදුම් මොඩියුලයට ආනයනය කළ යුතුය .
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 {}
ආනයනය කළ පසු, අපට අපගේ අච්චුව තුළ සිටම formControl භාවිතා කර එය "පදය" යන නමට සැකසිය හැකිය.
<input type="text" [formControl]="term"/>
අපගේ අංගයක්, අප ක උදාහරණයක් නිර්මාණය FormControl
සිට @angular/form
අපේ අංගයක් මත නම කාලීන යටතේ ක්ෂේත්ර ලෙස එලිදරව් කෙරෙයි.
තිරය පිටුපස, යෙදුම ස්වයංක්රීයව අපට දායක විය හැකි Observable<string>
දේපලක් ලෙස නිරාවරණය කරයි valueChanges
. දැන් අපි ඇති බව Observable<string>
, පරිශීලක ආදාන ජය ඉල්ලා ලෙස පහසු පරිදි වේ debounceTime(400)
අප මත Observable
. Observable<string>
මීටර 400 ක් සඳහා නව අගයන් නොපැමිණෙන විට පමණක් නව අගයක් විමෝචනය වන නව දෙයක් මෙය නැවත ලබා දෙනු ඇත.
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));
}
}
අපගේ යෙදුම දැනටමත් ප්රති results ල පෙන්වන සෙවුම් යෙදුමක් සඳහා තවත් ඉල්ලීමක් යැවීම සම්පත් නාස්තියකි. අපේක්ෂිත හැසිරීම සාක්ෂාත් කර ගැනීම සඳහා distinctUntilChanged
අප කළ යුත්තේ අප ඇමතූ වහාම ක්රියාකරු අමතන්නdebounceTime(400)
ආදර්ශය බලන්න නිරීක්ෂණය මත ක්රියාත්මක Plunker
යල්පැනගිය ප්රතිචාර සමඟ කටයුතු කිරීම සඳහා කරුණාකර සම්පූර්ණ ලිපිය http://blog.whattram.io/angular/2016/01/06/taking-advantage-of-observables-in-angular2.html පරීක්ෂා කරන්න.
මම කෝණික භාෂාවෙන් Http භාවිතා කරන තාක් දුරට, සාමාන්ය භාවිත අවස්ථා වලදී නිරීක්ෂණය කළ හැකි පොරොන්දුව භාවිතා කිරීමේදී විශාල වෙනසක් නොමැති බව මම එකඟ වෙමි. මෙහි කිසිදු වාසියක් ප්රායෝගිකව අදාළ නොවේ. අනාගතයේදී මට සමහර උසස් භාවිත අවස්ථා දැක ගත හැකි යැයි සිතමි :)
වැඩිදුර ඉගෙන ගන්න
පොරොන්දු සහ නිරීක්ෂණ යන දෙකම ජාවාස්ක්රිප්ට් හි අසමමුහුර්ත ක්රියාකාරිත්වය සමඟ වැඩ කිරීමට අපට උපකාරී වේ. බොහෝ අවස්ථාවන්හිදී ඒවා බොහෝ සෙයින් සමාන ය, කෙසේ වෙතත්, මේ දෙක අතර තවමත් යම් වෙනස්කම් තිබේ, පොරොන්දු යනු http ඇමතුම් asynchronous
වැනි ආකාරවලින් විසඳන අගයන් ය . අනෙක් අතට, නිරීක්ෂකයන් අසමමුහුර්ත සිදුවීම් මාලාවක් සමඟ කටයුතු කරයි . ඔවුන් අතර ඇති ප්රධාන වෙනස්කම් පහත දැක්වේ:
පොරොන්දුව:
නිරීක්ෂණය කළ හැකි:
දෘශ්යමය වශයෙන් වෙනස්කම් පෙන්වීම සඳහා මම පහත රූපමය රූපය නිර්මාණය කර ඇත්තෙමි:
Promise
යනු පොරොන්දු වන ආකාරය ගැන සිතීම වැරදි ක්රමයකි. එහි Promise
වගකීම වන්නේ අසමසම අනුකූලතාවයකින් සාර්ථකත්වය හෝ අසාර්ථකත්වය හැසිරවීම පමණි .. ඔබට http ඉල්ලීමක් අවලංගු කිරීමට අවශ්ය නම් ඔබ ඉල්ලීම අවලංගු කරන්න, පොරොන්දුව නොව, අවලංගු කිරීමේ ප්රති result ලය පොරොන්දුව ඉටු කිරීම හෝ ප්රතික්ෂේප කිරීම. jsfiddle.net/greggman/ea0yhd4p
පොරොන්දු
නිරීක්ෂණ
අවශ්ය විටෙක නැවත උත්සාහ කිරීම සඳහා එක් ක්රියාකරු නැවත උත්සාහයක් භාවිතා කළ හැකිය, එසේම සමහර කොන්දේසි මත පදනම්ව නිරීක්ෂණය කළ හැකි නැවත උත්සාහ කිරීමට අපට අවශ්ය නම් නැවත උත්සාහ කරන්න .
සටහන : ක්රියාකරුවන්ගේ ලැයිස්තුවක් සහ ඔවුන්ගේ අන්තර්ක්රියාකාරී රූප සටහන් RxMarbles.com වෙතින් ලබා ගත හැකිය
නිරීක්ෂණයේ එක් අවාසියක් පිළිතුරු වල නොමැත. පොරොන්දු මඟින් ES7 අසින්ක් / අපේක්ෂිත කාර්යයන් භාවිතා කිරීමට ඉඩ ලබා දේ. ඔවුන් සමඟ ඔබට සමමුහුර්ත කේතයක් ලිවිය හැකිය, එය සමමුහුර්ත ක්රියාකාරී ඇමතුමක් වනු ඇත, එබැවින් ඔබට තවදුරටත් ඇමතුම් අවශ්ය නොවේ. නිරීක්ෂකයන්ට මෙය කිරීමට ඇති එකම හැකියාව නම් ඒවා පොරොන්දු බවට පරිවර්තනය කිරීමයි. නමුත් ඔබ ඒවා පොරොන්දු බවට පරිවර්තනය කළ විට, ඔබට නැවත ලැබිය හැක්කේ එක් ප්රතිලාභ අගයක් පමණි:
async function getData(){
const data = await observable.first().toPromise();
//do stuff with 'data' (no callback function needed)
}
වැඩිදුර කියවීම: Rx නිරීක්ෂණය කළ හැකි දෙයක් සඳහා මා බලා සිටින්නේ කෙසේද?
පොරොන්දු සහ නිරීක්ෂණ යන දෙකම හසුරුවන්නේ අසමමුහුර්ත ඇමතුම පමණි.
ඔවුන් අතර ඇති වෙනස්කම් මෙන්න:
නිරීක්ෂණය කළ හැකි
පොරොන්දුව
වරකට එක් අගයක් පමණක් විමෝචනය කරයි
.Then සහ .catch නොමැතිව සේවාවන් අමතයි
අවලංගු කළ නොහැක
කිසිදු ක්රියාකරුවෙකු සපයන්නේ නැත
මෙම පිළිතුර ප්රමාද වුවද, මම පහත වෙනස්කම් සාරාංශ කොට ඇත,
නිරීක්ෂණය කළ හැකි:
function
ගත වන බව an observer
a හා නැවත පැමිණීම function Observer: an object with next, error.
subscribe/unsubscribe
එහි දත්ත ඇල, නිරීක්ෂකයා, ලබන වටිනාකම විමෝචනය, notify
ගැන, නිරීක්ෂකයා errors
සහ ගැන නිරීක්ෂකයාගේ දැනුම්stream completion
function to handle next value
ධාරාවේ, දෝෂ සහ අවසානය සපයයි (ui සිදුවීම්, http ප්රතිචාර, වෙබ් සොකට් සහිත දත්ත).multiple values
කාලයත් සමඟ වැඩ කරයිcancel-able/retry-able
වැනි ක්රියාකරුවන්ට සහය දක්වයි map,filter,reduce
.Observable.create()
- ප්රතිලාභ නිරීක්ෂණය කළ හැකි ක්රමවේදයන් ක්රියාත්මක කළ හැකිය - Observer Observable.from()
- අරාව පරිවර්තනය කළ හැකි හෝ නැවත කළ හැකි - Observable Observable.fromEvent()
- සිදුවීමක් නිරීක්ෂණය කළ හැකි Observable.fromPromise()
බවට පරිවර්තනය කරයි - පොරොන්දුවක් නිරීක්ෂණය කළ හැකි බවට පරිවර්තනය කරයි - Observable.range()
- විශේෂිත පරාසයේ පූර්ණ සංඛ්යා අනුක්රමයක් ලබා දෙයිපොරොන්දුව :
පොරොන්දුවක් නියෝජනය කරන්නේ අනාගතයේදී අවසන් වන කාර්යයකි;
පොරොන්දු බවට පත්වේ resolved by a value
;
ව්යතිරේක මගින් පොරොන්දු ප්රතික්ෂේප වේ;
නැත cancellable
, එය නැවත පැමිණේa single value
පොරොන්දුවක් මඟින් ශ්රිතයක් හෙළි කරයි (then)
-එවිට අලුත් දෙයක් ලබා දෙයි promise
;
ඒ සඳහා attachment
වන අවසර මත පදනම්ව ක්රියාත්මක වේ
state
;
- handlers
ය guaranteed
තුළ ක්රියාත්මක කිරීමට order attached
;
අනෙක් සියලුම පිළිතුරු ඔබගේ සැකයන් දුරු කළ යුතු යැයි මම විශ්වාස කරමි. එසේ වුවද, නිරීක්ෂණයන් ක්රියාකාරී ක්රමලේඛනය මත පදනම් වී ඇති බව එක් කිරීමට මට අවශ්ය වූ අතර, සිතියම, පැතලි සිතියම, අඩු කිරීම, සිප් වැනි කාර්යයන් සමඟ එය ඉතා ප්රයෝජනවත් වේ. විශේෂයෙන් API ඉල්ලීම් මත රඳා පවතින විට වෙබය ලබා ගන්නා අනුකූලතාව ම්ලේච්ඡ වැඩිදියුණු කිරීමකි.
මෙම ලේඛනය ප්රතික්රියාකාරක X හි නිල ලියකියවිලි බැවින් මම එය තරයේ නිර්දේශ කරමි .
ඔබට නිරීක්ෂණය කළ හැකි නම්, කොටස් 3 කින් යුත් මෙම ලිපිය යෝජනා කරමි: http://blog.danlew.net/2014/09/15/grokking-rxjava-part-1/
එය RxJava සඳහා අදහස් කළද, සංකල්ප එක හා සමාන වන අතර එය සැබවින්ම හොඳින් පැහැදිලි කර ඇත. ප්රතික්රියාශීලී එක්ස් ප්රලේඛනයේදී, ඔබට එක් එක් ශ්රිතය සඳහා සමානකම් ඇත. ඔබ RxJS සොයා බැලිය යුතුය.
පොරොන්දු හොඳම විසඳුම වූ ගැටලුවක් සමඟ මම දැන් කටයුතු කර ඇති අතර, මෙම ප්රශ්නය ප්රයෝජනවත් වන අවස්ථාවකදී පැකිලෙන ඕනෑම කෙනෙකුට මම එය මෙහි බෙදා දෙමි (මෙය මා කලින් සොයන පිළිතුරමයි):
Angular2 ව්යාපෘතියක මා සතුව පරාමිති කිහිපයක් ගෙන පෝරමයක් මත ඩ්රොප් ඩවුන් මෙනු ජනගහනය කිරීම සඳහා වටිනාකම් ලැයිස්තුවක් ලබා දේ. පෝරම සංරචකය ආරම්භ කරන විට, විවිධ ඩ්රොප් ඩවුන් මෙනු ගණනාවක් නිර්වචනය කිරීම සඳහා මට එකම පරාමිතිය විවිධ පරාමිතීන් සමඟ ඇමතිය යුතුය, කෙසේ වෙතත් මම සේවාව ඇමතීම සඳහා සියලු විචල්යයන් පෝලිම් කළහොත්, අවසාන එක පමණක් සාර්ථක වන අතර ඉතිරි දෝෂය පිටතට. දත්ත සමුදායෙන් ලබා ගන්නා සේවාවට කළ හැක්කේ වරකට එක් ඉල්ලීමක් පමණි.
සියලුම ඩ්රොප් ඩවුන් මෙනු විචල්යයන් සාර්ථකව ජනගහනය කිරීමට ඇති එකම ක්රමය නම්, අවසාන ඉල්ලීම අවසන් වන තෙක් නව ඉල්ලීමක් ක්රියාවට නැංවීම වළක්වන අයුරින් සේවාව ඇමතීමයි. පොරොන්දුව / .එහි යාන්ත්රණය මඟින් ගැටලුව මනාව විසඳීය.
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;
}) }
මම සංරචකයේ ඇති කාර්යයන් නිර්වචනය කර ngOnInit හි initializeDropDowns () ලෙස හැඳින්වුවෙමි.
FetchValueList ශ්රිතය පොරොන්දුවක් ලබා දෙයි, එබැවින් පළමු ඇමතුම පළමු ලැයිස්තු කේතය පසු කරන අතර පොරොන්දුව නිරාකරණය වූ විට, ප්රතිලාභ අගය .එහි බ්ලොක් එකේ දත්ත විචල්යය තුළ ඇත. ශ්රිතය දත්ත ආපසු ලබා දී ඇති බැවින්, සේවාව අවසන් වී ඇති බව අපි දනිමු. දෙවන ලැයිස්තු කේතය සමඟ නැවත ඇමතීම ආරක්ෂිතයි, ප්රතිලාභ අගය ඊළඟ විචල්යයේ දත්ත විචල්යය තුළ ඇත .එම අවහිරය සහ අපි එය මෙම තත්පරයට ලබා දෙන්නෙමු.
සියලුම විචල්යයන් ජනගහනය කිරීම සඳහා අපට අවශ්ය වාර ගණනක් දම්වැල් කළ හැකි අතර, අවසාන කේත වාරණයේදී අපි ආපසු ප්රකාශය අතහැර දමා වාරණය අවසන් වේ.
මෙය ඉතා නිශ්චිත භාවිත අවස්ථාවකි, එහිදී අපට තනි සේවාවක් ඇති අතර එය සංරචකය ආරම්භ වන විට කිහිප වතාවක් කැඳවිය යුතු අතර, සේවාව ලබා ගැනීම සම්පූර්ණ කර එය නැවත කැඳවීමට පෙර වටිනාකමක් ලබා දිය යුතුය, නමුත් මේ අවස්ථාවේ දී, පොරොන්දුව / .එවිට ක්රමය වඩාත් සුදුසු විය.
scan()
අනුක්රමික නිරීක්ෂණ ප්රවාහයක් තැනීමට නිදසුනක් ලෙස භාවිතා කළ හැකිය. කෙසේ වෙතත්, ඔබේ ප්රවේශය වඩාත් පැහැදිලි සහ තේරුම් ගැනීමට පහසු විය හැකිය.
අසමමුහුර්ත හැසිරීම් සමඟ කටයුතු කිරීම සඳහා ඔබට සැමවිටම නිරීක්ෂණය කළ හැකි දෙයක් භාවිතා කළ හැකිය. කෙසේ වෙතත්, සමහර විට නිරීක්ෂණය කළ හැකි මෙම අතිරේක ක්රියාකාරිත්වය අවශ්ය නොවේ. එවිට ඒවා භාවිතා කිරීම සඳහා පුස්තකාලයක් ආනයනය කිරීම අමතර කාර්යයක් වනු ඇත.
ඔබට ප්රති as ල සැකසීමට අවශ්ය තනි අසමමුහුර්ත මෙහෙයුමක් ඇති විට පොරොන්දු භාවිතා කරන්න . උදාහරණයක් වශයෙන්:
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
එබැවින් පොරොන්දුවක් මඟින් යම් කේතයක් නිරාකරණය කරන හෝ ප්රතික්ෂේප කරන තැනක් ක්රියාත්මක කරයි. විසඳීම හෝ ප්රතික්ෂේප කිරීම යනුවෙන් හැඳින්වුවහොත් පොරොන්දුව අපේක්ෂිත තත්වයේ සිට විසඳන ලද හෝ ප්රතික්ෂේප කරන ලද තත්වයකට යයි. පොරොන්දු තත්ත්වය නිරාකරණය කළ විට then()
ක්රමය හැඳින්වේ. පොරොන්දු රාජ්යය ප්රතික්ෂේප කළ විට, catch()
ක්රමය හැඳින්වේ.
කාලයත් සමඟ ඔබ හැසිරවිය යුතු ප්රවාහයක් (දත්ත) ඇති විට නිරීක්ෂණ භාවිතා කරන්න . ප්රවාහයක් යනු කාලයත් සමඟ ලබා ගත හැකි දත්ත මූලද්රව්යයන්ගේ අනුක්රමයකි . ධාරාවන් සඳහා උදාහරණ:
ම නිරීක්ෂණය දී විට නිරූපනය කොට ඇති නම් ඊළග යන විට සිදු වූ දෝශයක් , හෝ නිරීක්ෂණය කරන විට අවසන් . එවිට අපට මෙම නිරීක්ෂණයට දායක විය හැකි අතර එය සක්රිය කරන අතර මෙම දායකත්වයේ දී අපට ඇමතුම් 3 කින් සමත් විය හැකිය (සෑම විටම සියල්ල සමත් විය යුතු නැත). සාර්ථකත්වය සඳහා ක්රියාත්මක කළ යුතු එක් ඇමතුමක්, දෝෂයක් සඳහා එක් ඇමතුමක් සහ සම්පූර්ණ කිරීම සඳහා එක් ඇමතුමක්. උදාහරණයක් වශයෙන්:
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
නිරීක්ෂණය කළ හැකි දෙයක් නිර්මාණය කිරීමේදී නිරීක්ෂකයෙකුට තර්කයක් ලෙස සපයන ඇමතුම් ආපසු ගැනීමේ ශ්රිතයක් අවශ්ය වේ. මෙම නිරීක්ෂකයකු, ඔබ පසුව ඇමතිය හැකි onNext
, onCompleted
, onError
. නිරීක්ෂණයට දායක වූ විට ඊට අනුරූප ඇමතුම් ආපසු දායකත්වයට ලැබෙනු ඇත.
පොරොන්දුව - අනාගත වටිනාකමක් ලබා දෙන්න. කම්මැලි නොවේ. අවලංගු කළ නොහැක. එය ප්රතික්ෂේප කිරීම හෝ විසඳීම සිදු කරනු ඇත.
නිරීක්ෂණය කළ හැකි - අනාගත වටිනාකමක් ලබා දෙන්න. කම්මැලි. අවලංගු කළ හැකිය. එය වෙනත් ක්රම සජීවී සිතියම, පෙරණය, අඩු කිරීම සපයයි.
const promise = new Promise(resolve => {
setTimeout(() => {
resolve("Hello from a Promise!");
}, 2000);
});
promise.then(value => console.log(value));
දැන් නිරීක්ෂණය කළ හැකි උදාහරණය. මෙහිදී ද අපි නිරීක්ෂණය කළ හැකි ශ්රිතයක්, අසින්ක් කාර්යය හැසිරවීමට නිරීක්ෂකයෙකුට යමු. පොරොන්දුවේ විසඳුම මෙන් නොව එයට පහත ක්රමවේදය ඇති අතර ඒ වෙනුවට දායකත්වය ලබා ගනී.
එබැවින් දෙකම අසින්ක් කාර්යයන් හසුරුවයි. දැන් අපි වෙනස බලමු.
const observable = new Observable(observer => {
setTimeout(() => {
observer.next('Hello from a Observable!');
}, 2000);
});
observable.subscribe(value => console.log(value));
පොරොන්දුව
නිරීක්ෂණය කළ හැකි
අසමමුහුර්ත ක්රියාකාරකමක් අවසන් වූ විට හෝ අසමත් වූ විට පොරොන්දුවක් මඟින් තනි සිදුවීමක් විමෝචනය වේ.
නිරීක්ෂණය කළ හැකි ධාරාවක් (බොහෝ භාෂාවලින්) සමාන වන අතර සෑම සිදුවීමක් සඳහාම ඇමතුම් ලබා ගැනීම අවශ්ය වන අවම වශයෙන් ශුන්ය හෝ වැඩි ගණනක් වත් සම්මත කිරීමට අවසර දෙයි.
පොරොන්දුවට වඩා බොහෝ විට නිරීක්ෂණය කළ හැකි වන්නේ එය පොරොන්දුවේ උද්දීපනයන් සහ තවත් දේ ලබා දෙන බැවිනි. නිරීක්ෂණය කළ හැකි දේ සමඟ ඔබට 0, 1 හෝ විවිධ සිදුවීම් හැසිරවීමට අවශ්ය නම් එය වැදගත් නොවේ. එක් එක් සිද්ධිය සඳහා ඔබට සමාන API භාවිතා කළ හැකිය.
පොරොන්දුව: පොරොන්දුව තනි අගයක් විමෝචනය කරයි
උදාහරණයක් වශයෙන්:
const numberPromise = new Promise((resolve) => {
resolve(5);
resolve(10);
});
numberPromise.then(value => console.log(value));
// still prints only 5
නිරීක්ෂණය කළ හැකි: යම් කාලයක් තුළ බහු අගයන් විමෝචනය කරයි
උදාහරණයක් වශයෙන්:
const numberObservable = new Observable((observer) => {
observer.next(5);
observer.next(10);
});
numberObservable.subscribe(value => console.log(value));
// prints 5 and 10
යම් කාල සීමාවක් තුළ බහුවිධ අගයන් විමෝචනය කරන ප්රවාහයක් වැනි නිරීක්ෂණය කළ හැකි යැයි අපට සිතිය හැකි අතර විමෝචනය වන සෑම අයිතමයක් සඳහාම එකම ඇමතුම් ලබා ගැනීමේ ශ්රිතය කැඳවනු ලැබේ. එම දත්ත යම් කාලයක් පුරා තනි අගයක් හෝ බහු අගයක් ලෙස සම්ප්රේෂණය වේ ද යන්න.
පොරොන්දුව:
නිරීක්ෂණය කළ හැකි:
පොරොන්දු සහ නිරීක්ෂණ යන දෙකම අසමමුහුර්ත මෙහෙයුම් සමඟ කටයුතු කිරීමට අපට උපකාරී වේ. මෙම අසමමුහුර්ත මෙහෙයුම් සිදු කරන විට ඔවුන්ට ඇතැම් ඇමතුම් ලබා ගත හැකිය.
HTTP සමඟ ගනුදෙනු කිරීම සඳහා වන පොරොන්දු වෙනුවට කෝණික RxJS වෙතින් වන නිරීක්ෂණ භාවිතා කරයි
Below are some important differences in promises & Observables.
පොරොන්දුව තනි අගයක් විමෝචනය කරන අතර නිරීක්ෂණය කළ හැකි බහු අගයන් විමෝචනය කරයි. එබැවින්, HTTP ඉල්ලීමක් හසුරුවන අතරතුර, පොරොන්දුවට එකම ඉල්ලීම සඳහා තනි ප්රතිචාරයක් කළමනාකරණය කළ හැකිය, නමුත් එකම ඉල්ලීමට බහුවිධ ප්රතිචාර තිබේ නම්, අප විසින් නිරීක්ෂණය කළ හැකි දේ භාවිතා කළ යුතුය. ඔව්, නිරීක්ෂණයට එකම ඉල්ලීම සඳහා බහුවිධ ප්රතිචාර දැක්විය හැකිය.
පොරොන්දුව
const promise = new Promise((data) =>
{ data(1);
data(2);
data(3); })
.then(element => console.log(‘Promise ‘ + element));
ප්රතිදානය
Promise 1
නිරීක්ෂණය කළ හැකි
const observable = new Observable((data) => {
data.next(1);
data.next(2);
data.next(3);
}).subscribe(element => console.log('Observable ' + element));
ප්රතිදානය
Observable 1
Observable 2
Observable 3
කෙටි පිළිතුර :
නිරීක්ෂණය වේ වඩා හොඳ , ඒ සියල්ල ඇති පොරොන්දු විශේෂාංග ප්ලස් ලක්ෂණ.
දිගු පිළිතුර:
පොරොන්දු:
නිරීක්ෂණය කළ හැකි:
පොරොන්දු සහ නිරීක්ෂණවල වැදගත් වෙනස්කම් කිහිපයක් පහත දැක්වේ.
පොරොන්දුව
නිරීක්ෂණය කළ හැකි
වඩා හොඳ අවබෝධයක් සඳහා https://stackblitz.com/edit/observable-vs-promises වෙත යොමු වන්න
පිළිගත් පිළිතුර පොදුවේ හොඳ වුවත්, කෝණික සංරචක සමඟ කටයුතු කිරීමේදී ඔබට සෑම විටම පාහේ නිරීක්ෂණය කළ හැකි දෙයක් භාවිතා කිරීමට අවශ්ය බව අවධාරණය කරයි. පොරොන්දු අවලංගු කළ නොහැකි අතර ඔබේ සංරචකය විනාශ වුවද එය විසඳනු ඇත. කෝණික එය නොමැති තෙක් සමාව දීමට නැඹුරු වේ.
උදාහරණයක් ලෙස විනාශ වූ සංරචකයක් මත සිදුවන ඕනෑම වෙනස් කිරීමක් අනාවරණය වීම ව්යතිරේකයකට හේතු වේ:
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();
});
}
පොරොන්දුව විසඳීමට පෙර ඔබේ සංරචකය විනාශ වුවහොත්, පොරොන්දුව විසඳන විට ඔබට attempt to use destroyed view
දෝෂයක් ලැබෙනු ඇත.
විකල්පයක් ලෙස, ඔබ takeUntil රටාව සමඟ නිරීක්ෂක භාවිතා කරන්නේ නම්, ඔබේ සංරචකය විනාශ වූ වහාම දායකත්වය අවලංගු වේ.
මෙය තරමක් ව්යාකූල උදාහරණයකි, නමුත් විනාශ වූ සංරචකයක් සඳහා කේතය ක්රියාත්මක කිරීම බොහෝ විට දෝෂ වලට තුඩු දෙනු ඇත. කිසියම් හේතුවක් නිසා ඔබට එය කිරීමට අවශ්ය නැතිනම්: p
පොරොන්දුව:
අසින්ක් සිදුවීම් හසුරුවන්නෙකු - පොරොන්දු වස්තුව නිරූපණය කරන්නේ අසමමුහුර්ත මෙහෙයුමක අවසාන නිමාව (හෝ අසමත් වීම) සහ එහි ප්රති value ල වටිනාකමයි.
වාක්ය ඛණ්ඩය: නව පොරොන්දුව (ක්රියාත්මක කරන්නා);
උදා:
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);
පොරොන්දුව ගැන: එයට එක් නල මාර්ගයක් ඇත, එබැවින් එය අගයන් ලබා දෙන්නේ එක් වරක් පමණි. වරක් ඔබ ඇමතූ එහි එක් මාර්ග හසුරුවන්නා ඔබට අවලංගු කළ නොහැක. () සහ පසුව () වටා සෙල්ලම් කළ හැකි ප්රයෝජනවත් සින්ටැක්ස්
නිරීක්ෂණ:
නිරීක්ෂණය යනු කාලයත් සමඟ බහුවිධ අගයන් එකතු කිරීමකි. එය සැබවින්ම අසංක මෙහෙයුම් සඳහා විශිෂ්ට ප්රවේශයකි. හරස් වේදිකා සහය ඇති rxjs සමඟ කෝණික / ප්රතික්රියා ආදිය සමඟ එය කළ හැකිය .
එහි ක්රියාව ධාරා ලයිනර් වැනි ය. බහු නල මාර්ග විය හැකිය. එබැවින් නිර්වචනය කළ පසු ඔබට බොහෝ ස්ථානවල ප්රතිලාභ ලබා ගැනීමට දායක විය හැකිය.
සින්ටැක්ස්: import * as Rx from "@reactivex/rxjs";
ආරම්භයට:
Rx.Observable.fromEvent(button, "click"),
Rx.Subject()
යනාදිය
දායක වීමට: RxLogger.getInstance();
උදා:
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));
එය බහු නල මාර්ගයට සහය දක්වන බැවින් ඔබට ප්රති location ල විවිධ ස්ථානයකට දායක විය හැකිය, එයට පොරොන්දු වලට වඩා බොහෝ හැකියාවන් ඇත.
භාවිතය:
එයට තවත් හැකියාවන් ඇතmap, filter, pipe, map, concatMap etc
නිබන්ධනය සහ ලියකියවිලි පළමු වරට කියවීමෙන් මා ඒ දෙසට දිව ගිය දෙයක් බහු විකාශනය පිළිබඳ අදහස විය.
පෙරනිමියෙන්, බහු දායකත්වයන් නිරීක්ෂණය කළ හැකි බහුවිධ utions ාතන අවුලුවන බව ඔබ දන්නා බවට වග බලා ගන්න. එක් HTTP ඇමතුමකට බහුවිධ දායකත්වයන් ඔබ .share()
(බහු විකාශනය සක්රීය නොකරන්නේ නම්) එක හා සමාන HTTP ඇමතුම් කිහිපයක් අවුලුවනු ඇත .
පොරොන්දුවක් මඟින් වරකට එක් දෙයක් සමඟ ගනුදෙනු කිරීමට, එහි දත්ත ලිවීමට, ව්යතිරේක හැසිරවීමට, අසින්ක් / අපේක්ෂා කිරීම වැනි සිසිල් දේවල් සඳහා භාෂා සහාය ඇත.
නිරීක්ෂකයකුට සීනු හා විස්ල් රාශියක් ඇත, නමුත් ඔබ වැඩ කරන බලය තේරුම් ගත යුතුය හෝ එය අනිසි ලෙස භාවිතා කළ හැකිය.
නිරීක්ෂණය කළ හැකි “අවලංගු කළ හැකි” යන තර්කය භාවිතා කරන බොහෝ දෙනෙක් මට පෙනේ, නමුත් පොරොන්දුව “අවලංගු කළ හැකි” බවට පත් කිරීම තරමක් සුළු කාරණයකි.
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
නිරීක්ෂණ බොහෝ විට පොරොන්දු සමඟ සැසඳේ. මෙන්න ප්රධාන වෙනස්කම් කිහිපයක්:
නිරීක්ෂණ ප්රකාශන වේ; දායකත්වය ලැබෙන තෙක් ගණනය කිරීම ආරම්භ නොවේ. මැවීම මත වහාම ක්රියාත්මක වන බවට පොරොන්දු වේ. ඔබට ප්රති .ලය අවශ්ය විටෙක ක්රියාත්මක කළ හැකි වට්ටෝරු නිර්වචනය කිරීමට මෙය නිරීක්ෂණයන් ප්රයෝජනවත් කරයි.
නිරීක්ෂණ මගින් බොහෝ අගයන් සපයයි. පොරොන්දු එකක් සපයයි. කාලයත් සමඟ බහුවිධ අගයන් ලබා ගැනීම සඳහා නිරීක්ෂණයන් ප්රයෝජනවත් වේ.
නිරීක්ෂණ මගින් දම්වැල සහ දායකත්වය අතර වෙනස හඳුනා ගනී. පොරොන්දු ඇත්තේ .තන් () වගන්ති පමණි. කාර්යය ක්රියාවට නැංවීමකින් තොරව පද්ධතියේ අනෙකුත් කොටස් සඳහා භාවිතා කළ හැකි සංකීර්ණ පරිවර්තන වට්ටෝරු නිර්මාණය කිරීම සඳහා මෙය නිරීක්ෂණයන් ප්රයෝජනවත් කරයි.
නිරීක්ෂක දායකත්වය () දෝෂ හැසිරවීමට වගකිව යුතුය. දරුවාට පොරොන්දු තල්ලුවීමේ දෝෂ පොරොන්දු වේ. මෙය නිරීක්ෂණයන් මධ්යගත හා පුරෝකථනය කළ හැකි දෝෂ හැසිරවීම සඳහා ප්රයෝජනවත් වේ.
ANGULAR.IO ලියකියවිලි වලින් ඔබට සොයාගත හැකි සරලම වෙනස එයයි. විවේක පිළිතුර බොහෝ දෙනා විසින් ලබා දෙනු ලැබේ
පොරොන්දු යොමු වී ඇත්තේ තනි අගයන් හෝ විසඳුම් සඳහා පමණි, නිරීක්ෂණය යනු දත්ත ප්රවාහයයි.
නිරීක්ෂණ අවලංගු කළ හැකි නමුත් පොරොන්දු අවලංගු කළ නොහැක.
අවම වශයෙන් දන්නා එක, මට අවම වශයෙන්
පොරොන්දුව
අසමමුහුර්ත මෙහෙයුමක් සම්පූර්ණ වූ විට හෝ අසමත් වූ විට පොරොන්දුවක් තනි සිදුවීමක් හසුරුවයි.
සටහන: අවලංගු කිරීමට සහාය දෙන පොරොන්දු පුස්තකාල එහි ඇත, නමුත් ES6 පොරොන්දුව මෙතෙක් සිදු නොවේ.
නිරීක්ෂණය කළ හැකි
නිරීක්ෂණය කළ හැකි ධාරාවක් වැනි ය (බොහෝ භාෂාවලින්) සහ එක් එක් සිදුවීම සඳහා ඇමතුම් ලබා ගැනීම කැඳවනු ලබන සිදුවීම් ශුන්ය හෝ වැඩි ගණනක් පසු කිරීමට ඉඩ දෙයි.
මෙම මාතෘකාව පිළිබඳ දැනටමත් පිළිතුරු රාශියක් ඇති බැවින් මම අතිරික්තයක් එකතු නොකරමි.
නමුත් පොරොන්දු සමඟ සසඳන විට භාවිතා කළ හැකි නිරීක්ෂණය කළ හැකි / කෝණික සහ අරුමපුදුම දේ ඉගෙන ගැනීමට පටන් ගත් අයෙකුට , සෑම දෙයක්ම නිරීක්ෂණය කළ හැකි ලෙස තබා ගැනීමටත්, ඔබේ ව්යාපෘතියේ පවතින සියලුම පොරොන්දු නිරීක්ෂණය කළ හැකි බවට පරිවර්තනය කිරීමටත් මම නිර්දේශ කරමි.
හුදෙක් කෝණික රාමුව සහ එහි ප්රජාව සියල්ලම නිරීක්ෂණය කළ හැකි බැවිනි. එබැවින් ඔබ රාමු සේවා හෝ තෙවන පාර්ශවීය මොඩියුලයන් ඒකාබද්ධ කර සෑම දෙයක්ම එකට බැඳ තබන විට එය ප්රයෝජනවත් වනු ඇත.
සියලු පසුබෑම මම අගය කරන නමුත් නිරීක්ෂණයන් පිළිබඳ පොරොන්දු භාවිතා කිරීම සඳහා ඔබේ කෝණික ව්යාපෘතියේ තවමත් ප්රයෝජනවත් විය හැකි අවස්ථා කිහිපයක් ලැයිස්තුගත කිරීම සඳහා යමෙකු නිසි අදහස් දැක්වීමක් නොකරන්නේ නම් මම තවමත් මගේ මතය අවධාරනය කරමි.
ඇත්ත වශයෙන්ම, සෑම අවස්ථාවකම කිසිදු මතයක් 100% ක් නිවැරදි නැත, නමුත් අවම වශයෙන් මම සිතන්නේ කෝණික රාමුව තුළ ක්රියාත්මක කරන නිත්ය වාණිජ ව්යාපෘති සඳහා 98% ක් වත්, නිරීක්ෂණය කළ හැකි නිවැරදි මාර්ගයයි.
ඔබගේ සරල විනෝදාංශ ව්යාපෘතියේ ආරම්භක අවස්ථාවේදී ඔබ එයට අකමැති වුවද, ඔබ කෝණික සමඟ අන්තර්ක්රියා කරන සියලුම අංග පාහේ ඔබට වැටහෙනු ඇත, සහ බොහෝ කෝණික හිතකාමී තෙවන පාර්ශවීය රාමුවක් නිරීක්ෂණ භාවිතා කරයි, එවිට ඔබ ඔවුන් සමඟ සන්නිවේදනය කිරීම සඳහා ඔබේ පොරොන්දුව නිරන්තරයෙන් නිරීක්ෂණය කළ හැකි බවට පරිවර්තනය කිරීම අවසන් විය.
එම සංරචකවලට ඇතුළත් නමුත් ඒවාට පමණක් සීමා නොවේ: HttpClient, Form builder, කෝණික ද්රව්ය මොඩියුල / දෙබස්, Ngrx ගබඩාව / ප්රයෝග සහ ngx-bootstrap.
ඇත්ත වශයෙන්ම, පසුගිය වසර දෙක තුළ මා සමඟ කටයුතු කළ කෝණික පරිසර පද්ධතියෙන් ඇති එකම පොරොන්දුව එයයි APP_INITIALIZER
.
ජාවාස්ක්රිප්ට් / යතුරු ලියනයෙහි අසමමුහුර්ත ක්රියාකාරිත්වය සමඟ වැඩ කිරීමට නිරීක්ෂණ සහ පොරොන්දු අපට උපකාර කරයි. බොහෝ අවස්ථාවන්හිදී ඒවා බෙහෙවින් සමාන ය, කෙසේ වෙතත්, ඔවුන් අතර තවමත් යම් වෙනස්කම් තිබේ.