అధునాతన జావాస్క్రిప్ట్ జెనరేటర్ ప్యాటర్న్స్ను అన్వేషించండి, ఇందులో అసింక్రోనస్ ఇటరేషన్, స్టేట్ మెషీన్ ఇంప్లిమెంటేషన్, మరియు ఆధునిక వెబ్ డెవలప్మెంట్ కోసం ఆచరణాత్మక వినియోగ సందర్భాలు ఉన్నాయి.
జావాస్క్రిప్ట్ జెనరేటర్స్: అసింక్ ఇటరేషన్ మరియు స్టేట్ మెషీన్స్ కోసం అధునాతన ప్యాటర్న్స్
ES6లో పరిచయం చేయబడిన జావాస్క్రిప్ట్ జెనరేటర్స్, ఇటరేబుల్ ఆబ్జెక్ట్లను సృష్టించడానికి మరియు సంక్లిష్టమైన కంట్రోల్ ఫ్లోను నిర్వహించడానికి ఒక శక్తివంతమైన మెకానిజంను అందిస్తాయి. వాటి ప్రాథమిక వినియోగం చాలా సులభం అయినప్పటికీ, జెనరేటర్స్ యొక్క నిజమైన సామర్థ్యం అసింక్రోనస్ ఆపరేషన్లను నిర్వహించడం మరియు స్టేట్ మెషీన్స్ను అమలు చేయడంలో ఉంది. ఈ వ్యాసం జావాస్క్రిప్ట్ జెనరేటర్స్ను ఉపయోగించే అధునాతన ప్యాటర్న్స్ను, ముఖ్యంగా అసింక్రోనస్ ఇటరేషన్ మరియు స్టేట్ మెషీన్ ఇంప్లిమెంటేషన్పై, ఆధునిక వెబ్ డెవలప్మెంట్కు సంబంధించిన ఆచరణాత్మక ఉదాహరణలతో పాటుగా వివరిస్తుంది.
జావాస్క్రిప్ట్ జెనరేటర్స్ను అర్థం చేసుకోవడం
అధునాతన ప్యాటర్న్స్లోకి వెళ్లే ముందు, జావాస్క్రిప్ట్ జెనరేటర్స్ యొక్క ప్రాథమిక సూత్రాలను క్లుప్తంగా గుర్తుచేసుకుందాం.
జెనరేటర్స్ అంటే ఏమిటి?
జెనరేటర్ అనేది ఒక ప్రత్యేక రకం ఫంక్షన్, దానిని పాజ్ చేసి తిరిగి ప్రారంభించవచ్చు, ఇది ఒక ఫంక్షన్ యొక్క ఎగ్జిక్యూషన్ ఫ్లోను నియంత్రించడానికి మిమ్మల్ని అనుమతిస్తుంది. జెనరేటర్స్ function*
సింటాక్స్ని ఉపయోగించి నిర్వచించబడతాయి, మరియు అవి ఎగ్జిక్యూషన్ను పాజ్ చేయడానికి మరియు ఒక విలువను తిరిగి ఇవ్వడానికి yield
కీవర్డ్ను ఉపయోగిస్తాయి.
ముఖ్యమైన భావనలు:
function*
: జెనరేటర్ ఫంక్షన్ను సూచిస్తుంది.yield
: ఫంక్షన్ యొక్క ఎగ్జిక్యూషన్ను పాజ్ చేసి ఒక విలువను తిరిగి ఇస్తుంది.next()
: ఫంక్షన్ యొక్క ఎగ్జిక్యూషన్ను తిరిగి ప్రారంభిస్తుంది మరియు ఐచ్ఛికంగా ఒక విలువను జెనరేటర్లోకి తిరిగి పంపుతుంది.return()
: జెనరేటర్ను ముగించి, ఒక నిర్దిష్ట విలువను తిరిగి ఇస్తుంది.throw()
: జెనరేటర్ ఫంక్షన్లో ఒక ఎర్రర్ను త్రో చేస్తుంది.
ఉదాహరణ:
function* numberGenerator() {
yield 1;
yield 2;
yield 3;
}
const generator = numberGenerator();
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // { value: 2, done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
జెనరేటర్స్తో అసింక్రోనస్ ఇటరేషన్
జెనరేటర్స్ యొక్క అత్యంత శక్తివంతమైన అప్లికేషన్లలో ఒకటి అసింక్రోనస్ ఆపరేషన్లను నిర్వహించడం, ముఖ్యంగా డేటా స్ట్రీమ్లతో వ్యవహరించేటప్పుడు. అసింక్రోనస్ ఇటరేషన్ మీకు డేటా అందుబాటులోకి వచ్చినప్పుడు దానిని ప్రాసెస్ చేయడానికి అనుమతిస్తుంది, మెయిన్ థ్రెడ్ను బ్లాక్ చేయకుండా.
సమస్య: కాల్బ్యాక్ హెల్ మరియు ప్రామిసెస్
జావాస్క్రిప్ట్లో సాంప్రదాయ అసింక్రోనస్ ప్రోగ్రామింగ్ తరచుగా కాల్బ్యాక్లు లేదా ప్రామిసెస్ను కలిగి ఉంటుంది. ప్రామిసెస్ కాల్బ్యాక్లతో పోలిస్తే నిర్మాణాన్ని మెరుగుపరుస్తాయి, అయినప్పటికీ సంక్లిష్టమైన అసింక్రోనస్ ఫ్లోలను నిర్వహించడం ఇంకా గజిబిజిగా మారవచ్చు.
జెనరేటర్స్, ప్రామిసెస్ లేదా async/await
తో కలిపి, అసింక్రోనస్ ఇటరేషన్ను నిర్వహించడానికి ఒక శుభ్రమైన మరియు మరింత చదవగలిగే మార్గాన్ని అందిస్తాయి.
అసింక్ ఇటరేటర్స్
అసింక్ ఇటరేటర్స్ అసింక్రోనస్ డేటా సోర్స్లపై ఇటరేట్ చేయడానికి ఒక ప్రామాణిక ఇంటర్ఫేస్ను అందిస్తాయి. అవి సాధారణ ఇటరేటర్ల మాదిరిగానే ఉంటాయి కానీ అసింక్రోనస్ ఆపరేషన్లను నిర్వహించడానికి ప్రామిసెస్ను ఉపయోగిస్తాయి.
అసింక్ ఇటరేటర్స్ ఒక next()
మెథడ్ను కలిగి ఉంటాయి, ఇది value
మరియు done
ప్రాపర్టీలతో ఒక ఆబ్జెక్ట్కు రిసాల్వ్ అయ్యే ప్రామిస్ను తిరిగి ఇస్తుంది.
ఉదాహరణ:
asyn function* asyncNumberGenerator() {
yield await Promise.resolve(1);
yield await Promise.resolve(2);
yield await Promise.resolve(3);
}
async function consumeGenerator() {
const generator = asyncNumberGenerator();
console.log(await generator.next()); // { value: 1, done: false }
console.log(await generator.next()); // { value: 2, done: false }
console.log(await generator.next()); // { value: 3, done: false }
console.log(await generator.next()); // { value: undefined, done: true }
}
consumeGenerator();
అసింక్ ఇటరేషన్ కోసం వాస్తవ-ప్రపంచ వినియోగ సందర్భాలు
- API నుండి డేటాను స్ట్రీమింగ్ చేయడం: పేజినేషన్ను ఉపయోగించి సర్వర్ నుండి డేటాను భాగాలుగా తీసుకురావడం. ఒక సోషల్ మీడియా ప్లాట్ఫారమ్ను ఊహించుకోండి, అక్కడ మీరు యూజర్ బ్రౌజర్ను ఓవర్లోడ్ చేయకుండా పోస్ట్లను బ్యాచ్లలో తీసుకురావాలనుకుంటారు.
- పెద్ద ఫైళ్లను ప్రాసెస్ చేయడం: మొత్తం ఫైల్ను మెమరీలోకి లోడ్ చేయకుండా పెద్ద ఫైళ్లను లైన్ బై లైన్ చదవడం మరియు ప్రాసెస్ చేయడం. ఇది డేటా విశ్లేషణ సందర్భాలలో చాలా కీలకం.
- రియల్-టైమ్ డేటా స్ట్రీమ్స్: ఒక WebSocket లేదా సర్వర్-సెంట్ ఈవెంట్స్ (SSE) స్ట్రీమ్ నుండి రియల్-టైమ్ డేటాను నిర్వహించడం. ఒక లైవ్ స్పోర్ట్స్ స్కోర్స్ అప్లికేషన్ను ఆలోచించండి.
ఉదాహరణ: API నుండి డేటాను స్ట్రీమింగ్ చేయడం
పేజినేషన్ను ఉపయోగించే ఒక API నుండి డేటాను తీసుకువచ్చే ఉదాహరణను పరిశీలిద్దాం. మొత్తం డేటా తిరిగి వచ్చేవరకు భాగాలుగా డేటాను తీసుకువచ్చే ఒక జెనరేటర్ను మనం సృష్టిస్తాము.
async function* paginatedDataFetcher(url, pageSize = 10) {
let page = 1;
let hasMore = true;
while (hasMore) {
const response = await fetch(`${url}?page=${page}&pageSize=${pageSize}`);
const data = await response.json();
if (data.length === 0) {
hasMore = false;
return;
}
for (const item of data) {
yield item;
}
page++;
}
}
async function consumeData() {
const dataStream = paginatedDataFetcher('https://api.example.com/data');
for await (const item of dataStream) {
console.log(item);
// Process each item as it arrives
}
console.log('Data stream complete.');
}
consumeData();
ఈ ఉదాహరణలో:
paginatedDataFetcher
అనేది పేజినేషన్ను ఉపయోగించి API నుండి డేటాను తీసుకువచ్చే ఒక అసింక్ జెనరేటర్.yield item
స్టేట్మెంట్ ఎగ్జిక్యూషన్ను పాజ్ చేసి ప్రతి డేటా ఐటెమ్ను తిరిగి ఇస్తుంది.consumeData
ఫంక్షన్ డేటా స్ట్రీమ్పై అసింక్రోనస్గా ఇటరేట్ చేయడానికిfor await...of
లూప్ను ఉపయోగిస్తుంది.
ఈ పద్ధతి మీకు డేటా అందుబాటులోకి వచ్చినప్పుడు దానిని ప్రాసెస్ చేయడానికి అనుమతిస్తుంది, ఇది పెద్ద డేటాసెట్లను నిర్వహించడానికి సమర్థవంతంగా ఉంటుంది.
జెనరేటర్స్తో స్టేట్ మెషీన్స్
జెనరేటర్స్ యొక్క మరొక శక్తివంతమైన అప్లికేషన్ స్టేట్ మెషీన్స్ను ఇంప్లిమెంట్ చేయడం. ఒక స్టేట్ మెషీన్ అనేది ఇన్పుట్ ఈవెంట్ల ఆధారంగా విభిన్న స్థితుల మధ్య మారే ఒక కంప్యూటేషనల్ మోడల్.
స్టేట్ మెషీన్స్ అంటే ఏమిటి?
స్టేట్ మెషీన్స్ పరిమిత సంఖ్యలో స్థితులు మరియు ఆ స్థితుల మధ్య పరివర్తనలు ఉన్న సిస్టమ్లను మోడల్ చేయడానికి ఉపయోగించబడతాయి. అవి సంక్లిష్ట సిస్టమ్లను డిజైన్ చేయడానికి సాఫ్ట్వేర్ ఇంజనీరింగ్లో విస్తృతంగా ఉపయోగించబడతాయి.
ఒక స్టేట్ మెషీన్ యొక్క ముఖ్య భాగాలు:
- స్టేట్స్ (స్థితులు): సిస్టమ్ యొక్క విభిన్న పరిస్థితులు లేదా మోడ్లను సూచిస్తాయి.
- ఈవెంట్స్ (సంఘటనలు): స్థితుల మధ్య పరివర్తనలను ప్రేరేపిస్తాయి.
- ట్రాన్సిషన్స్ (పరివర్తనలు): ఈవెంట్ల ఆధారంగా ఒక స్థితి నుండి మరొక స్థితికి మారడానికి నియమాలను నిర్వచిస్తాయి.
జెనరేటర్స్తో స్టేట్ మెషీన్స్ను ఇంప్లిమెంట్ చేయడం
జెనరేటర్స్ స్టేట్ మెషీన్స్ను ఇంప్లిమెంట్ చేయడానికి ఒక సహజమైన మార్గాన్ని అందిస్తాయి, ఎందుకంటే అవి అంతర్గత స్థితిని నిర్వహించగలవు మరియు ఇన్పుట్ ఈవెంట్ల ఆధారంగా ఎగ్జిక్యూషన్ ఫ్లోను నియంత్రించగలవు.
ఒక జెనరేటర్లోని ప్రతి yield
స్టేట్మెంట్ ఒక స్థితిని సూచించగలదు, మరియు next()
మెథడ్ స్థితుల మధ్య పరివర్తనలను ప్రేరేపించడానికి ఉపయోగించబడుతుంది.
ఉదాహరణ: ఒక సాధారణ ట్రాఫిక్ లైట్ స్టేట్ మెషీన్
RED
, YELLOW
, మరియు GREEN
అనే మూడు స్థితులతో ఒక సాధారణ ట్రాఫిక్ లైట్ స్టేట్ మెషీన్ను పరిశీలిద్దాం.
function* trafficLightStateMachine() {
let state = 'RED';
while (true) {
switch (state) {
case 'RED':
console.log('Traffic Light: RED');
state = yield;
break;
case 'YELLOW':
console.log('Traffic Light: YELLOW');
state = yield;
break;
case 'GREEN':
console.log('Traffic Light: GREEN');
state = yield;
break;
default:
console.log('Invalid State');
state = yield;
}
}
}
const trafficLight = trafficLightStateMachine();
trafficLight.next(); // Initial state: RED
trafficLight.next('GREEN'); // Transition to GREEN
trafficLight.next('YELLOW'); // Transition to YELLOW
trafficLight.next('RED'); // Transition to RED
ఈ ఉదాహరణలో:
trafficLightStateMachine
అనేది ట్రాఫిక్ లైట్ స్టేట్ మెషీన్ను సూచించే ఒక జెనరేటర్.state
వేరియబుల్ ట్రాఫిక్ లైట్ యొక్క ప్రస్తుత స్థితిని కలిగి ఉంటుంది.yield
స్టేట్మెంట్ ఎగ్జిక్యూషన్ను పాజ్ చేసి తదుపరి స్థితి పరివర్తన కోసం వేచి ఉంటుంది.next()
మెథడ్ స్థితుల మధ్య పరివర్తనలను ప్రేరేపించడానికి ఉపయోగించబడుతుంది.
అధునాతన స్టేట్ మెషీన్ ప్యాటర్న్స్
1. స్టేట్ డెఫినిషన్స్ కోసం ఆబ్జెక్ట్లను ఉపయోగించడం
స్టేట్ మెషీన్ను మరింత నిర్వహించదగినదిగా చేయడానికి, మీరు స్థితులను సంబంధిత చర్యలతో ఆబ్జెక్ట్లుగా నిర్వచించవచ్చు.
const states = {
RED: {
name: 'RED',
action: () => console.log('Traffic Light: RED'),
},
YELLOW: {
name: 'YELLOW',
action: () => console.log('Traffic Light: YELLOW'),
},
GREEN: {
name: 'GREEN',
action: () => console.log('Traffic Light: GREEN'),
},
};
function* trafficLightStateMachine() {
let currentState = states.RED;
while (true) {
currentState.action();
const nextStateName = yield;
currentState = states[nextStateName] || currentState; // Fallback to current state if invalid
}
}
const trafficLight = trafficLightStateMachine();
trafficLight.next(); // Initial state: RED
trafficLight.next('GREEN'); // Transition to GREEN
trafficLight.next('YELLOW'); // Transition to YELLOW
trafficLight.next('RED'); // Transition to RED
2. ఈవెంట్స్తో ట్రాన్సిషన్లను నిర్వహించడం
మీరు ఈవెంట్ల ఆధారంగా స్థితుల మధ్య స్పష్టమైన పరివర్తనలను నిర్వచించవచ్చు.
const states = {
RED: {
name: 'RED',
action: () => console.log('Traffic Light: RED'),
transitions: {
TIMER: 'GREEN',
},
},
YELLOW: {
name: 'YELLOW',
action: () => console.log('Traffic Light: YELLOW'),
transitions: {
TIMER: 'RED',
},
},
GREEN: {
name: 'GREEN',
action: () => console.log('Traffic Light: GREEN'),
transitions: {
TIMER: 'YELLOW',
},
},
};
function* trafficLightStateMachine() {
let currentState = states.RED;
while (true) {
currentState.action();
const event = yield;
const nextStateName = currentState.transitions[event];
currentState = states[nextStateName] || currentState; // Fallback to current state if invalid
}
}
const trafficLight = trafficLightStateMachine();
trafficLight.next(); // Initial state: RED
// Simulate a timer event after some time
setTimeout(() => {
trafficLight.next('TIMER'); // Transition to GREEN
setTimeout(() => {
trafficLight.next('TIMER'); // Transition to YELLOW
setTimeout(() => {
trafficLight.next('TIMER'); // Transition to RED
}, 2000);
}, 5000);
}, 5000);
స్టేట్ మెషీన్స్ కోసం వాస్తవ-ప్రపంచ వినియోగ సందర్భాలు
- UI కాంపోనెంట్ స్టేట్ మేనేజ్మెంట్: ఒక UI కాంపోనెంట్ యొక్క స్థితిని నిర్వహించడం, ఉదాహరణకు ఒక బటన్ (ఉదా.,
IDLE
,HOVER
,PRESSED
,DISABLED
). - వర్క్ఫ్లో మేనేజ్మెంట్: ఆర్డర్ ప్రాసెసింగ్ లేదా డాక్యుమెంట్ ఆమోదం వంటి సంక్లిష్ట వర్క్ఫ్లోలను అమలు చేయడం.
- గేమ్ డెవలప్మెంట్: గేమ్ ఎంటిటీల ప్రవర్తనను నియంత్రించడం (ఉదా.,
IDLE
,WALKING
,ATTACKING
,DEAD
).
జెనరేటర్స్లో ఎర్రర్ హ్యాండ్లింగ్
జెనరేటర్స్తో పనిచేసేటప్పుడు, ముఖ్యంగా అసింక్రోనస్ ఆపరేషన్లు లేదా స్టేట్ మెషీన్స్తో వ్యవహరించేటప్పుడు ఎర్రర్ హ్యాండ్లింగ్ చాలా ముఖ్యం. జెనరేటర్స్ try...catch
బ్లాక్ మరియు throw()
మెథడ్ను ఉపయోగించి ఎర్రర్లను నిర్వహించడానికి మెకానిజంలను అందిస్తాయి.
try...catch
ఉపయోగించడం
ఎగ్జిక్యూషన్ సమయంలో సంభవించే ఎర్రర్లను క్యాచ్ చేయడానికి మీరు ఒక జెనరేటర్ ఫంక్షన్లో try...catch
బ్లాక్ను ఉపయోగించవచ్చు.
function* errorGenerator() {
try {
yield 1;
throw new Error('Something went wrong');
yield 2; // This line will not be executed
} catch (error) {
console.error('Error caught:', error.message);
yield 'Error handled';
}
yield 3;
}
const generator = errorGenerator();
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.next()); // Error caught: Something went wrong
// { value: 'Error handled', done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
throw()
ఉపయోగించడం
throw()
మెథడ్ మీకు బయటి నుండి జెనరేటర్లోకి ఒక ఎర్రర్ను త్రో చేయడానికి అనుమతిస్తుంది.
function* throwGenerator() {
try {
yield 1;
yield 2;
} catch (error) {
console.error('Error caught:', error.message);
yield 'Error handled';
}
yield 3;
}
const generator = throwGenerator();
console.log(generator.next()); // { value: 1, done: false }
console.log(generator.throw(new Error('External error'))); // Error caught: External error
// { value: 'Error handled', done: false }
console.log(generator.next()); // { value: 3, done: false }
console.log(generator.next()); // { value: undefined, done: true }
అసింక్ ఇటరేటర్స్లో ఎర్రర్ హ్యాండ్లింగ్
అసింక్ ఇటరేటర్స్తో పనిచేసేటప్పుడు, అసింక్రోనస్ ఆపరేషన్ల సమయంలో సంభవించే ఎర్రర్లను మీరు నిర్వహించాల్సి ఉంటుంది.
async function* asyncErrorGenerator() {
try {
yield await Promise.reject(new Error('Async error'));
} catch (error) {
console.error('Async error caught:', error.message);
yield 'Async error handled';
}
}
async function consumeGenerator() {
const generator = asyncErrorGenerator();
console.log(await generator.next()); // Async error caught: Async error
// { value: 'Async error handled', done: false }
}
consumeGenerator();
జెనరేటర్స్ను ఉపయోగించడానికి ఉత్తమ పద్ధతులు
- సంక్లిష్ట కంట్రోల్ ఫ్లో కోసం జెనరేటర్స్ను ఉపయోగించండి: ఒక ఫంక్షన్ యొక్క ఎగ్జిక్యూషన్ ఫ్లోపై మీకు సూక్ష్మ-స్థాయి నియంత్రణ అవసరమైన సందర్భాలలో జెనరేటర్స్ ఉత్తమంగా సరిపోతాయి.
- అసింక్రోనస్ ఆపరేషన్ల కోసం జెనరేటర్స్ను ప్రామిసెస్ లేదా
async/await
తో కలపండి: ఇది మీకు అసింక్రోనస్ కోడ్ను మరింత సింక్రోనస్ మరియు చదవగలిగే శైలిలో వ్రాయడానికి అనుమతిస్తుంది. - సంక్లిష్ట స్థితులు మరియు పరివర్తనలను నిర్వహించడానికి స్టేట్ మెషీన్స్ను ఉపయోగించండి: స్టేట్ మెషీన్స్ మీకు సంక్లిష్ట సిస్టమ్లను ఒక నిర్మాణాత్మక మరియు నిర్వహించదగిన విధంగా మోడల్ చేయడానికి మరియు అమలు చేయడానికి సహాయపడతాయి.
- ఎర్రర్లను సరిగ్గా నిర్వహించండి: ఊహించని ప్రవర్తనను నివారించడానికి మీ జెనరేటర్స్లో ఎల్లప్పుడూ ఎర్రర్లను నిర్వహించండి.
- జెనరేటర్స్ను చిన్నగా మరియు కేంద్రీకృతంగా ఉంచండి: ప్రతి జెనరేటర్కు ఒక స్పష్టమైన మరియు చక్కగా నిర్వచించబడిన ఉద్దేశ్యం ఉండాలి.
- మీ జెనరేటర్స్ను డాక్యుమెంట్ చేయండి: మీ జెనరేటర్స్ కోసం వాటి ఉద్దేశ్యం, ఇన్పుట్లు మరియు అవుట్పుట్లతో సహా స్పష్టమైన డాక్యుమెంటేషన్ను అందించండి. ఇది కోడ్ను అర్థం చేసుకోవడానికి మరియు నిర్వహించడానికి సులభతరం చేస్తుంది.
ముగింపు
జావాస్క్రిప్ట్ జెనరేటర్స్ అసింక్రోనస్ ఆపరేషన్లను నిర్వహించడానికి మరియు స్టేట్ మెషీన్స్ను అమలు చేయడానికి ఒక శక్తివంతమైన సాధనం. అసింక్రోనస్ ఇటరేషన్ మరియు స్టేట్ మెషీన్ ఇంప్లిమెంటేషన్ వంటి అధునాతన ప్యాటర్న్స్ను అర్థం చేసుకోవడం ద్వారా, మీరు మరింత సమర్థవంతమైన, నిర్వహించదగిన మరియు చదవగలిగే కోడ్ను వ్రాయగలరు. మీరు ఒక API నుండి డేటాను స్ట్రీమింగ్ చేస్తున్నా, UI కాంపోనెంట్ స్థితులను నిర్వహిస్తున్నా, లేదా సంక్లిష్ట వర్క్ఫ్లోలను అమలు చేస్తున్నా, జెనరేటర్స్ విస్తృత శ్రేణి ప్రోగ్రామింగ్ సవాళ్లకు ఒక సౌకర్యవంతమైన మరియు సొగసైన పరిష్కారాన్ని అందిస్తాయి. మీ జావాస్క్రిప్ట్ డెవలప్మెంట్ నైపుణ్యాలను ఉన్నతీకరించడానికి మరియు మరింత పటిష్టమైన మరియు స్కేలబుల్ అప్లికేషన్లను నిర్మించడానికి జెనరేటర్స్ శక్తిని స్వీకరించండి.