éåæã€ãã¬ãŒã·ã§ã³ãã¹ããŒããã·ã³å®è£ ãææ°ã®Webéçºã«ãããå®è·µçãªãŠãŒã¹ã±ãŒã¹ãå«ããé«åºŠãªJavaScriptãžã§ãã¬ãŒã¿ãŒãã¿ãŒã³ãæ¢æ±ããŸãã
JavaScriptãžã§ãã¬ãŒã¿ãŒïŒéåæã€ãã¬ãŒã·ã§ã³ãšã¹ããŒããã·ã³ã®ããã®é«åºŠãªãã¿ãŒã³
ES6ã§å°å ¥ãããJavaScriptãžã§ãã¬ãŒã¿ãŒã¯ãå埩å¯èœãªãªããžã§ã¯ããäœæããè€éãªå¶åŸ¡ãããŒã管çããããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸããåºæ¬çãªäœ¿çšæ³ã¯æ¯èŒçç°¡åã§ããããžã§ãã¬ãŒã¿ãŒã®çã®å¯èœæ§ã¯ãéåææäœãåŠçããã¹ããŒããã·ã³ãå®è£ ããèœåã«ãããŸãããã®èšäºã§ã¯ãJavaScriptãžã§ãã¬ãŒã¿ãŒã䜿çšããé«åºŠãªãã¿ãŒã³ã«ã€ããŠæãäžããéåæã€ãã¬ãŒã·ã§ã³ãšã¹ããŒããã·ã³å®è£ ã«çŠç¹ãåœãŠãææ°ã®Webéçºã«é¢é£ããå®è·µçãªäŸã瀺ããŸãã
JavaScriptãžã§ãã¬ãŒã¿ãŒã®çè§£
é«åºŠãªãã¿ãŒã³ã«å ¥ãåã«ãJavaScriptãžã§ãã¬ãŒã¿ãŒã®åºæ¬ãç°¡åã«æ¯ãè¿ããŸãããã
ãžã§ãã¬ãŒã¿ãŒãšã¯ïŒ
ãžã§ãã¬ãŒã¿ãŒã¯ãäžæåæ¢ããã³åéã§ããç¹æ®ãªã¿ã€ãã®é¢æ°ã§ããã颿°ã®å®è¡ãããŒãå¶åŸ¡ã§ããŸãããžã§ãã¬ãŒã¿ãŒã¯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 }
ãžã§ãã¬ãŒã¿ãŒã䜿çšããéåæã€ãã¬ãŒã·ã§ã³
ãžã§ãã¬ãŒã¿ãŒã®æã匷åãªã¢ããªã±ãŒã·ã§ã³ã®1ã€ã¯ãç¹ã«ããŒã¿ã®ã¹ããªãŒã ãæ±ãå Žåã®éåææäœã®åŠçã§ããéåæã€ãã¬ãŒã·ã§ã³ã䜿çšãããšãã¡ã€ã³ã¹ã¬ããããããã¯ããã«ãããŒã¿ãå©çšå¯èœã«ãªããšããã«ããŒã¿ãåŠçã§ããŸãã
åé¡ïŒã³ãŒã«ããã¯å°çãšPromise
JavaScriptã§ã®åŸæ¥ã®éåæããã°ã©ãã³ã°ã«ã¯ãã³ãŒã«ããã¯ãŸãã¯Promiseãããå«ãŸããŸããPromiseã¯ã³ãŒã«ããã¯ãšæ¯èŒããŠæ§é ãæ¹åããŸãããè€éãªéåæãããŒã管çããã®ã¯äŸç¶ãšããŠé¢åã«ãªãå¯èœæ§ããããŸãã
ãžã§ãã¬ãŒã¿ãŒã¯ãPromiseãŸãã¯async/await
ãšçµã¿åãããããšã§ãéåæã€ãã¬ãŒã·ã§ã³ãåŠçããããã®ããã¯ãªãŒã³ã§èªã¿ãããæ¹æ³ãæäŸããŸãã
éåæã€ãã¬ãŒã¿ãŒ
éåæã€ãã¬ãŒã¿ãŒã¯ãéåæããŒã¿ãœãŒã¹ãå埩åŠçããããã®æšæºã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸãããããã¯éåžžã®ã€ãã¬ãŒã¿ãŒã«äŒŒãŠããŸãããPromiseã䜿çšããŠéåææäœãåŠçããŸãã
éåæã€ãã¬ãŒã¿ãŒã«ã¯ãvalue
ããããã£ãšdone
ããããã£ãæã€ãªããžã§ã¯ãã«è§£æ±ºãããPromiseãè¿ãnext()
ã¡ãœããããããŸãã
äŸïŒ
async 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ããã®ããŒã¿ã®ã¹ããªãŒãã³ã°ïŒããŒãžããŒã·ã§ã³ã䜿çšããŠãµãŒããŒããããŒã¿ããã£ã³ã¯ã§ãã§ããããŸãããŠãŒã¶ãŒã®ãã©ãŠã¶ãå§åããªãããã«ãæçš¿ããããã§ãã§ããããããœãŒã·ã£ã«ã¡ãã£ã¢ãã©ãããã©ãŒã ãæ³åããŠã¿ãŠãã ããã
- 倧ããªãã¡ã€ã«ã®åŠçïŒãã¡ã€ã«å šäœãã¡ã¢ãªã«ããŒãããã«ã倧ããªãã¡ã€ã«ã1è¡ãã€èªã¿åããåŠçããŸããããã¯ãããŒã¿åæã®ã·ããªãªã§éèŠã§ãã
- ãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒã ïŒWebSocketãŸãã¯Server-Sent EventsïŒ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
ã«ãŒãã䜿çšããŠãããŒã¿ã¹ããªãŒã ãéåæçã«å埩åŠçããŸãã
ãã®ã¢ãããŒãã«ãããããŒã¿ãå©çšå¯èœã«ãªããšããã«ããŒã¿ãåŠçã§ããããã倧ããªããŒã¿ã»ãããåŠçããã®ã«å¹ççã§ãã
ãžã§ãã¬ãŒã¿ãŒã䜿çšããã¹ããŒããã·ã³
ãžã§ãã¬ãŒã¿ãŒã®ãã1ã€ã®åŒ·åãªã¢ããªã±ãŒã·ã§ã³ã¯ãã¹ããŒããã·ã³ã®å®è£ ã§ããã¹ããŒããã·ã³ã¯ãå ¥åã€ãã³ãã«åºã¥ããŠç°ãªãç¶æ éãé·ç§»ããèšç®ã¢ãã«ã§ãã
ã¹ããŒããã·ã³ãšã¯ïŒ
ã¹ããŒããã·ã³ã¯ãæéæ°ã®ç¶æ ãšãããã®ç¶æ éã®é·ç§»ãæã€ã·ã¹ãã ãã¢ãã«åããããã«äœ¿çšãããŸãããããã¯ãè€éãªã·ã¹ãã ãèšèšããããã®ãœãããŠã§ã¢ãšã³ãžãã¢ãªã³ã°ã§åºã䜿çšãããŠããŸãã
ã¹ããŒããã·ã³ã®äž»èŠã³ã³ããŒãã³ãïŒ
- ç¶æ ïŒã·ã¹ãã ã®ç°ãªãæ¡ä»¶ãŸãã¯ã¢ãŒãã衚ããŸãã
- ã€ãã³ãïŒç¶æ éã®é·ç§»ãããªã¬ãŒããŸãã
- é·ç§»ïŒã€ãã³ãã«åºã¥ããŠããç¶æ ããå¥ã®ç¶æ ã«ç§»åããããã®ã«ãŒã«ãå®çŸ©ããŸãã
ãžã§ãã¬ãŒã¿ãŒã䜿çšããã¹ããŒããã·ã³ã®å®è£
ãžã§ãã¬ãŒã¿ãŒã¯ãå éšç¶æ ãç¶æããå ¥åã€ãã³ãã«åºã¥ããŠå®è¡ãããŒãå¶åŸ¡ã§ãããããã¹ããŒããã·ã³ãå®è£ ããèªç¶ãªæ¹æ³ãæäŸããŸãã
ãžã§ãã¬ãŒã¿ãŒã®åyield
ã¹ããŒãã¡ã³ãã¯ç¶æ
ã衚ããnext()
ã¡ãœããã䜿çšããŠç¶æ
éã®é·ç§»ãããªã¬ãŒã§ããŸãã
äŸïŒåçŽãªä¿¡å·æ©ã¹ããŒããã·ã³
3ã€ã®ç¶æ
ïŒ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();
ãžã§ãã¬ãŒã¿ãŒã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
- è€éãªå¶åŸ¡ãããŒã«ãžã§ãã¬ãŒã¿ãŒã䜿çšããïŒãžã§ãã¬ãŒã¿ãŒã¯ã颿°ã®å®è¡ãããŒã现ããå¶åŸ¡ããå¿ èŠãããã·ããªãªã«æé©ã§ãã
- éåææäœã«ã¯ããžã§ãã¬ãŒã¿ãŒãšPromiseãŸãã¯
async/await
ãçµã¿åãããïŒããã«ãããéåæã³ãŒããããåæçã«èªã¿ãããã¹ã¿ã€ã«ã§èšè¿°ã§ããŸãã - è€éãªç¶æ ãšé·ç§»ã管çããã«ã¯ãã¹ããŒããã·ã³ã䜿çšããïŒã¹ããŒããã·ã³ã¯ãè€éãªã·ã¹ãã ãæ§é åãããä¿å®ããããæ¹æ³ã§ã¢ãã«åããã³å®è£ ããã®ã«åœ¹ç«ã¡ãŸãã
- ãšã©ãŒãé©åã«åŠçããïŒäºæããªãåäœãé²ãããã«ãåžžã«ãžã§ãã¬ãŒã¿ãŒå ã§ãšã©ãŒãåŠçããŸãã
- ãžã§ãã¬ãŒã¿ãŒãå°ãããçŠç¹ãçµãïŒåãžã§ãã¬ãŒã¿ãŒã¯ãæç¢ºã§æç¢ºãªç®çãæã£ãŠããå¿ èŠããããŸãã
- ãžã§ãã¬ãŒã¿ãŒãããã¥ã¡ã³ãåããïŒç®çãå ¥åãåºåãªã©ããžã§ãã¬ãŒã¿ãŒã®æç¢ºãªããã¥ã¡ã³ããæäŸããŸããããã«ãããã³ãŒããçè§£ãããããä¿å®ãããããªããŸãã
çµè«
JavaScriptãžã§ãã¬ãŒã¿ãŒã¯ãéåææäœãåŠçããã¹ããŒããã·ã³ãå®è£ ããããã®åŒ·åãªããŒã«ã§ããéåæã€ãã¬ãŒã·ã§ã³ãã¹ããŒããã·ã³å®è£ ãªã©ã®é«åºŠãªãã¿ãŒã³ãçè§£ããããšã§ãããå¹ççã§ä¿å®ãããããèªã¿ãããã³ãŒããäœæã§ããŸããAPIããããŒã¿ãã¹ããªãŒãã³ã°ããå Žåã§ããUIã³ã³ããŒãã³ãã®ç¶æ ã管çããå Žåã§ããè€éãªã¯ãŒã¯ãããŒãå®è£ ããå Žåã§ãããžã§ãã¬ãŒã¿ãŒã¯ãå¹ åºãããã°ã©ãã³ã°ã®èª²é¡ã«å¯Ÿããæè»ã§ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸãããžã§ãã¬ãŒã¿ãŒã®åãæŽ»çšããŠãJavaScriptéçºã¹ãã«ãé«ããããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŠãã ããã