JavaScript Async Iterator Helpersã®èœåãæ¢æ±ããå¹ççã§ãšã¬ã¬ã³ããªã¹ããªãŒã åŠçãå®çŸããŸãããããããã®ãŠãŒãã£ãªãã£ãéåæããŒã¿æäœãç°¡çŽ åããæ°ããªå¯èœæ§ãåãéãæ¹æ³ãåŠã³ãŸãã
JavaScript Async Iterator Helpers: ã¹ããªãŒã åŠçã®èœåãè§£ãæŸã€
çµ¶ããé²åããJavaScriptéçºã®äžçã«ãããŠãéåæããã°ã©ãã³ã°ã¯ãŸããŸãéèŠã«ãªã£ãŠããŸããç¹ã«ããŒã¿ã®ã¹ããªãŒã ãæ±ãå Žåãéåææäœãå¹ççãã€ãšã¬ã¬ã³ãã«åŠçããããšãæãéèŠã§ããJavaScriptã®éåæã€ãã¬ãŒã¿ãŒãšãžã§ãã¬ãŒã¿ãŒã¯ãã¹ããªãŒã åŠçã®ããã®åŒ·åãªåºç€ãæäŸããAsync Iterator Helpersã¯ãããæ°ããªã¬ãã«ã®ã·ã³ãã«ããšè¡šçŸåã«åŒãäžããŸãããã®ã¬ã€ãã§ã¯ãAsync Iterator Helpersã®äžçã«æ·±ãå ¥ã蟌ã¿ããã®èœåãæ¢æ±ããéåæããŒã¿æäœã¿ã¹ã¯ãã©ã®ããã«å¹çåã§ãããã瀺ããŸãã
éåæã€ãã¬ãŒã¿ãŒãšãžã§ãã¬ãŒã¿ãŒãšã¯ïŒ
ãã«ããŒã«ã€ããŠæãäžããåã«ãéåæã€ãã¬ãŒã¿ãŒãšãžã§ãã¬ãŒã¿ãŒãç°¡åã«ããããããŸããããéåæã€ãã¬ãŒã¿ãŒã¯ãã€ãã¬ãŒã¿ãŒãããã³ã«ã«æºæ ãã€ã€éåæã«åäœãããªããžã§ã¯ãã§ããããã¯ããã®`next()`ã¡ãœããã`value`ãš`done`ããããã£ãæã€ãªããžã§ã¯ãã«è§£æ±ºãããPromiseãè¿ãããšãæå³ããŸããéåæãžã§ãã¬ãŒã¿ãŒã¯éåæã€ãã¬ãŒã¿ãŒãè¿ã颿°ã§ãããéåæã®å€ã®ã·ãŒã±ã³ã¹ãçæããããšãã§ããŸãã
ãªã¢ãŒãAPIããããŒã¿ããã£ã³ã¯åäœã§èªã¿åãå¿ èŠãããã·ããªãªãèããŠã¿ãŸããããéåæã€ãã¬ãŒã¿ãŒãšãžã§ãã¬ãŒã¿ãŒã䜿çšãããšãããŒã¿ã»ããå šäœãããŠã³ããŒããããã®ãåŸ ã€ã®ã§ã¯ãªããå©çšå¯èœã«ãªã£ãããŒã¿ãé æ¬¡åŠçããããŒã¿ã¹ããªãŒã ãäœæã§ããŸãã
async function* fetchUserData(url) {
let page = 1;
let hasMore = true;
while (hasMore) {
const response = await fetch(`${url}?page=${page}`);
const data = await response.json();
if (data.users.length === 0) {
hasMore = false;
break;
}
for (const user of data.users) {
yield user;
}
page++;
}
}
// 䜿çšäŸ:
const userStream = fetchUserData('https://api.example.com/users');
for await (const user of userStream) {
console.log(user);
}
ãã®äŸã¯ãéåæãžã§ãã¬ãŒã¿ãŒã䜿çšããŠAPIããååŸãããŠãŒã¶ãŒããŒã¿ã®ã¹ããªãŒã ãäœæããæ¹æ³ã瀺ããŠããŸãã`yield`ããŒã¯ãŒãã«ããã颿°ã®å®è¡ãäžæåæ¢ããŠå€ãè¿ãããšãã§ãããã®å€ã¯`for await...of`ã«ãŒãã«ãã£ãŠæ¶è²»ãããŸãã
Async Iterator Helpersã®ç޹ä»
Async Iterator Helpersã¯ãéåæã€ãã¬ãŒã¿ãŒäžã§åäœãããŠãŒãã£ãªãã£ã¡ãœããã®ã»ãããæäŸããäžè¬çãªããŒã¿å€æããã£ã«ã¿ãªã³ã°æäœãç°¡æœã§èªã¿ãããæ¹æ³ã§å®è¡ã§ããããã«ããŸãããããã®ãã«ããŒã¯`map`ã`filter`ã`reduce`ã®ãããªé åã¡ãœããã«äŒŒãŠããŸãããéåæã«åäœããããŒã¿ã®ã¹ããªãŒã äžã§æäœããŸãã
æãäžè¬çã«äœ¿çšãããAsync Iterator Helpersã«ã¯ã以äžã®ãããªãã®ããããŸãïŒ
- map: ã€ãã¬ãŒã¿ãŒã®åèŠçŽ ã倿ããŸãã
- filter: ç¹å®ã®æ¡ä»¶ãæºããèŠçŽ ãéžæããŸãã
- take: ã€ãã¬ãŒã¿ãŒããæå®ãããæ°ã®èŠçŽ ãååŸããŸãã
- drop: ã€ãã¬ãŒã¿ãŒã®æå®ãããæ°ã®èŠçŽ ãã¹ãããããŸãã
- reduce: ã€ãã¬ãŒã¿ãŒã®èŠçŽ ãåäžã®å€ã«éçŽããŸãã
- toArray: ã€ãã¬ãŒã¿ãŒãé åã«å€æããŸãã
- forEach: ã€ãã¬ãŒã¿ãŒã®åèŠçŽ ã«å¯ŸããŠé¢æ°ãå®è¡ããŸãã
- some: å°ãªããšã1ã€ã®èŠçŽ ãæ¡ä»¶ãæºããã確èªããŸãã
- every: ãã¹ãŠã®èŠçŽ ãæ¡ä»¶ãæºããã確èªããŸãã
- find: æ¡ä»¶ãæºããæåã®èŠçŽ ãè¿ããŸãã
- flatMap: åèŠçŽ ãã€ãã¬ãŒã¿ãŒã«ãããããçµæããã©ããåããŸãã
ãããã®ãã«ããŒã¯ãŸã å ¬åŒã®ECMAScriptæšæºã®äžéšã§ã¯ãããŸããããå€ãã®JavaScriptã©ã³ã¿ã€ã ã§å©çšå¯èœã§ãããããªãã£ã«ããã©ã³ã¹ãã€ã©ãä»ããŠäœ¿çšã§ããŸãã
Async Iterator Helpersã®å®çšäŸ
Async Iterator Helpersãã¹ããªãŒã åŠçã¿ã¹ã¯ãç°¡çŽ åããããã«ã©ã®ããã«äœ¿çšã§ããããããã€ãã®å®çšçãªäŸãèŠãŠã¿ãŸãããã
äŸ1ïŒãŠãŒã¶ãŒããŒã¿ã®ãã£ã«ã¿ãªã³ã°ãšãããã³ã°
åã®äŸã®ãŠãŒã¶ãŒã¹ããªãŒã ãããç¹å®ã®åœïŒäŸïŒã«ããïŒã®ãŠãŒã¶ãŒã®ã¿ããã£ã«ã¿ãªã³ã°ãããã®ã¡ãŒã«ã¢ãã¬ã¹ãæœåºããããšããŸãã
async function* fetchUserData(url) { ... } // åãšåã
async function main() {
const userStream = fetchUserData('https://api.example.com/users');
const canadianEmails = userStream
.filter(user => user.country === 'Canada')
.map(user => user.email);
for await (const email of canadianEmails) {
console.log(email);
}
}
main();
ãã®äŸã¯ã`filter`ãš`map`ãé£çµããŠã宣èšçãªã¹ã¿ã€ã«ã§è€éãªããŒã¿å€æãå®è¡ããæ¹æ³ã瀺ããŠããŸããã³ãŒãã¯ãåŸæ¥ã®ã«ãŒããæ¡ä»¶æã䜿çšããå Žåãšæ¯èŒããŠãã¯ããã«èªã¿ããããä¿å®ãããããªã£ãŠããŸãã
äŸ2ïŒãŠãŒã¶ãŒã®å¹³å幎霢ã®èšç®
ã¹ããªãŒã å ã®å šãŠãŒã¶ãŒã®å¹³å幎霢ãèšç®ããããšããŸãã
async function* fetchUserData(url) { ... } // åãšåã
async function main() {
const userStream = fetchUserData('https://api.example.com/users');
const totalAge = await userStream.reduce((acc, user) => acc + user.age, 0);
const userCount = await userStream.toArray().then(arr => arr.length); // é·ãã確å®ã«ååŸããã«ã¯é
åã«å€æããå¿
èŠãããïŒãŸãã¯å¥ã®ã«ãŠã³ã¿ãŒãç¶æããïŒ
const averageAge = totalAge / userCount;
console.log(`Average age: ${averageAge}`);
}
main();
ãã®äŸã§ã¯ã`reduce`ã䜿çšããŠå šãŠãŒã¶ãŒã®ç·å¹Žéœ¢ãéèšããŠããŸãã`reduce`ãéåæã€ãã¬ãŒã¿ãŒã§çŽæ¥äœ¿çšãããšã€ãã¬ãŒã¿ãŒãæ¶è²»ãããããããŠãŒã¶ãŒæ°ãæ£ç¢ºã«ååŸããã«ã¯ã`toArray`ã䜿çšããŠé åã«å€æããïŒããã«ããå šèŠçŽ ãã¡ã¢ãªã«èªã¿èŸŒãŸããïŒãã`reduce`颿°å ã§å¥ã®ã«ãŠã³ã¿ãŒãç¶æããå¿ èŠããããŸããéåžžã«å€§èŠæš¡ãªããŒã¿ã»ããã®å Žåãé åãžã®å€æã¯é©ããŠããªãå¯èœæ§ããããŸããã«ãŠã³ããšåèšã®äž¡æ¹ãèšç®ããã ããªããäž¡æ¹ã®æäœãåäžã®`reduce`ã«ãŸãšããæ¹ãè¯ãã¢ãããŒãã§ãã
async function* fetchUserData(url) { ... } // åãšåã
async function main() {
const userStream = fetchUserData('https://api.example.com/users');
const { totalAge, userCount } = await userStream.reduce(
(acc, user) => ({
totalAge: acc.totalAge + user.age,
userCount: acc.userCount + 1,
}),
{ totalAge: 0, userCount: 0 }
);
const averageAge = totalAge / userCount;
console.log(`Average age: ${averageAge}`);
}
main();
ãã®æ¹åãããããŒãžã§ã³ã§ã¯ãç·å¹Žéœ¢ãšãŠãŒã¶ãŒæ°ã®äž¡æ¹ã®éèšã`reduce`颿°å ã«ãŸãšããããšã§ãã¹ããªãŒã ãé åã«å€æããå¿ èŠããªããªããç¹ã«å€§èŠæš¡ãªããŒã¿ã»ããã§ããå¹ççã«ãªããŸãã
äŸ3ïŒéåæã¹ããªãŒã ã§ã®ãšã©ãŒãã³ããªã³ã°
éåæã¹ããªãŒã ãæ±ãéã«ã¯ãæœåšçãªãšã©ãŒãé©åã«åŠçããããšãéèŠã§ããã¹ããªãŒã åŠçã®ããžãã¯ã`try...catch`ãããã¯ã§å²ãããšã§ãã€ãã¬ãŒã·ã§ã³äžã«çºçããå¯èœæ§ã®ããäŸå€ããã£ããã§ããŸãã
async function* fetchUserData(url) {
try {
let page = 1;
let hasMore = true;
while (hasMore) {
const response = await fetch(`${url}?page=${page}`);
response.throwForStatus(); // 200çªå°ä»¥å€ã®ã¹ããŒã¿ã¹ã³ãŒãã§ãšã©ãŒãã¹ããŒ
const data = await response.json();
if (data.users.length === 0) {
hasMore = false;
break;
}
for (const user of data.users) {
yield user;
}
page++;
}
} catch (error) {
console.error('Error fetching user data:', error);
// ãªãã·ã§ã³ã§ããšã©ãŒãªããžã§ã¯ããyieldãããããšã©ãŒãåã¹ããŒãã
// yield { error: error.message }; // ãšã©ãŒãªããžã§ã¯ããyieldããäŸ
}
}
async function main() {
const userStream = fetchUserData('https://api.example.com/users');
try {
for await (const user of userStream) {
console.log(user);
}
} catch (error) {
console.error('Error processing user stream:', error);
}
}
main();
ãã®äŸã§ã¯ã`fetchUserData`颿°ãš`for await...of`ã«ãŒãã`try...catch`ãããã¯ã§å²ã¿ãããŒã¿ååŸäžããã³åŠçäžã®æœåšçãªãšã©ãŒãåŠçããŸãã`response.throwForStatus()`ã¡ãœããã¯ãHTTPã¬ã¹ãã³ã¹ã®ã¹ããŒã¿ã¹ã³ãŒãã200-299ã®ç¯å²ã«ãªãå Žåã«ãšã©ãŒãã¹ããŒãããããã¯ãŒã¯ãšã©ãŒããã£ããã§ããããã«ããŸãããŸãããžã§ãã¬ãŒã¿ãŒé¢æ°ãããšã©ãŒãªããžã§ã¯ããyieldããããšãéžæã§ããã¹ããªãŒã ã®ã³ã³ã·ã¥ãŒããŒã«ããå€ãã®æ å ±ãæäŸããŸããããã¯ããããã¯ãŒã¯ã®ä¿¡é Œæ§ã倧ããç°ãªãå¯èœæ§ãããã°ããŒãã«ã«åæ£ããã·ã¹ãã ã§ã¯éåžžã«éèŠã§ãã
Async Iterator Helpersã䜿çšããã¡ãªãã
Async Iterator Helpersã䜿çšããããšã«ã¯ãããã€ãã®å©ç¹ããããŸãïŒ
- å¯èªæ§ã®åäž: Async Iterator Helpersã®å®£èšçãªã¹ã¿ã€ã«ã«ãããã³ãŒããèªã¿ãããçè§£ãããããªããŸãã
- çç£æ§ã®åäž: äžè¬çãªããŒã¿æäœã¿ã¹ã¯ãç°¡çŽ åããèšè¿°ããå¿ èŠã®ãããã€ã©ãŒãã¬ãŒãã³ãŒãã®éãæžãããŸãã
- ä¿å®æ§ã®åäž: ãããã®ãã«ããŒã®é¢æ°çãªæ§è³ªã¯ãã³ãŒãã®åå©çšãä¿é²ãããšã©ãŒãå°å ¥ãããªã¹ã¯ãäœæžããŸãã
- ããã©ãŒãã³ã¹ã®åäž: Async Iterator Helpersã¯éåæããŒã¿åŠçã«æé©åã§ãããããåŸæ¥ã®ã«ãŒãããŒã¹ã®ã¢ãããŒããšæ¯èŒããŠããã©ãŒãã³ã¹ãåäžããå¯èœæ§ããããŸãã
èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹
Async Iterator Helpersã¯ã¹ããªãŒã åŠçã®ããã®åŒ·åãªããŒã«ã»ãããæäŸããŸãããç¹å®ã®èæ ®äºé ãšãã¹ããã©ã¯ãã£ã¹ãèªèããããšãéèŠã§ãïŒ
- ã¡ã¢ãªäœ¿çšé: ç¹ã«å€§èŠæš¡ãªããŒã¿ã»ãããæ±ãå Žåã¯ãã¡ã¢ãªäœ¿çšéã«æ³šæããŠãã ãããå¿ èŠã§ãªãéãã`toArray`ã®ããã«ã¹ããªãŒã å šäœãã¡ã¢ãªã«èªã¿èŸŒãæäœã¯é¿ããŠãã ãããå¯èœãªéã`reduce`ã`forEach`ã®ãããªã¹ããªãŒãã³ã°æäœã䜿çšããŠãã ããã
- ãšã©ãŒãã³ããªã³ã°: éåææäœäžã«çºçããå¯èœæ§ã®ãããšã©ãŒãé©åã«åŠçããããã«ãå ç¢ãªãšã©ãŒãã³ããªã³ã°ã¡ã«ããºã ãå®è£ ããŠãã ããã
- ãã£ã³ã»ã«åŠç: ã¹ããªãŒã ãäžèŠã«ãªã£ããšãã«äžå¿ èŠãªåŠçãé²ãããããã£ã³ã»ã«åŠçã®ãµããŒãã远å ããããšãæ€èšããŠãã ãããããã¯ãé·æéå®è¡ãããã¿ã¹ã¯ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãæ±ãå Žåã«ç¹ã«éèŠã§ãã
- ããã¯ãã¬ãã·ã£ãŒ: ãããã¥ãŒãµãŒãã³ã³ã·ã¥ãŒããŒãå§åããã®ãé²ãããã«ãããã¯ãã¬ãã·ã£ãŒïŒèå§ïŒã¡ã«ããºã ãå®è£ ããŠãã ãããããã¯ãã¬ãŒãå¶éããããã¡ãªã³ã°ãªã©ã®æè¡ã䜿çšããŠå®çŸã§ããŸããããã¯ãç¹ã«äºæž¬äžå¯èœãªããŒã¿ãœãŒã¹ãæ±ãéã«ãã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ã確ä¿ããããã«éåžžã«éèŠã§ãã
- äºææ§: ãããã®ãã«ããŒã¯ãŸã æšæºã§ã¯ãªããããå€ãç°å¢ã察象ãšããå Žåã¯ãããªãã£ã«ããã©ã³ã¹ãã€ã©ã䜿çšããŠäºææ§ã確ä¿ããŠãã ããã
Async Iterator Helpersã®ã°ããŒãã«ãªå¿çš
Async Iterator Helpersã¯ãéåæããŒã¿ã¹ããªãŒã ã®åŠçãäžå¯æ¬ ãªããŸããŸãªã°ããŒãã«ã¢ããªã±ãŒã·ã§ã³ã§ç¹ã«æçšã§ãïŒ
- ãªã¢ã«ã¿ã€ã ããŒã¿åŠç: ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒããéèåžå Žãã»ã³ãµãŒãããã¯ãŒã¯ãªã©ã®ããŸããŸãªãœãŒã¹ããã®ãªã¢ã«ã¿ã€ã ããŒã¿ã¹ããªãŒã ãåæãããã¬ã³ãã®ç¹å®ãç°åžžã®æ€åºãã€ã³ãµã€ãã®çæãè¡ããŸããäŸãã°ãã°ããŒãã«ãªã€ãã³ãã«å¯Ÿããäžè«ãçè§£ããããã«ãèšèªãææ ã«åºã¥ããŠãã€ãŒãããã£ã«ã¿ãªã³ã°ãããªã©ã§ãã
- ããŒã¿çµ±å: ç°ãªããã©ãŒãããããããã³ã«ãæã€è€æ°ã®APIãããŒã¿ããŒã¹ããã®ããŒã¿ãçµ±åããŸããAsync Iterator Helpersã䜿çšããŠãäžå€®ãªããžããªã«ä¿åããåã«ããŒã¿ã倿ããã³æ£èŠåã§ããŸããäŸãã°ãããããç¬èªã®APIãæã€ç°ãªãeã³ããŒã¹ãã©ãããã©ãŒã ããã®å£²äžããŒã¿ããçµ±äžãããã¬ããŒãã·ã¹ãã ã«éçŽãããªã©ã§ãã
- å€§èŠæš¡ãã¡ã€ã«åŠç: ãã°ãã¡ã€ã«ããããªãã¡ã€ã«ãªã©ã®å€§èŠæš¡ãªãã¡ã€ã«ãããã¡ã€ã«å šäœãã¡ã¢ãªã«èªã¿èŸŒãããšãªãã¹ããªãŒãã³ã°æ¹åŒã§åŠçããŸããããã«ãããå¹ççãªããŒã¿ã®åæãšå€æãå¯èœã«ãªããŸããäŸãã°ãã°ããŒãã«ã«åæ£ããã€ã³ãã©ã¹ãã©ã¯ãã£ããã®å·šå€§ãªãµãŒããŒãã°ãåŠçããŠãããã©ãŒãã³ã¹ã®ããã«ããã¯ãç¹å®ããããšãæ³åããŠã¿ãŠãã ããã
- ã€ãã³ãé§ååã¢ãŒããã¯ãã£: éåæã€ãã³ããç¹å®ã®ã¢ã¯ã·ã§ã³ãã¯ãŒã¯ãããŒãããªã¬ãŒããã€ãã³ãé§ååã¢ãŒããã¯ãã£ãæ§ç¯ããŸããAsync Iterator Helpersã䜿çšããŠãã€ãã³ãããã£ã«ã¿ãªã³ã°ã倿ããç°ãªãã³ã³ã·ã¥ãŒããŒã«ã«ãŒãã£ã³ã°ã§ããŸããäŸãã°ããŠãŒã¶ãŒã®ã¢ã¯ãã£ããã£ã€ãã³ããåŠçããŠãæšå¥šãããŒãœãã©ã€ãºããããããŒã±ãã£ã³ã°ãã£ã³ããŒã³ãããªã¬ãŒããããããªã©ã§ãã
- æ©æ¢°åŠç¿ãã€ãã©ã€ã³: æ©æ¢°åŠç¿ã¢ããªã±ãŒã·ã§ã³çšã®ããŒã¿ãã€ãã©ã€ã³ãäœæããŸããããã§ã¯ãããŒã¿ãååŠçã倿ãããæ©æ¢°åŠç¿ã¢ãã«ã«äŸçµŠãããŸããAsync Iterator Helpersã䜿çšããŠãå€§èŠæš¡ãªããŒã¿ã»ãããå¹ççã«åŠçããè€éãªããŒã¿å€æãå®è¡ã§ããŸãã
çµè«
JavaScript Async Iterator Helpersã¯ãéåæããŒã¿ã¹ããªãŒã ãåŠçããããã®åŒ·åã§ãšã¬ã¬ã³ããªæ¹æ³ãæäŸããŸãããããã®ãŠãŒãã£ãªãã£ã掻çšããããšã§ãã³ãŒããç°¡çŽ åããå¯èªæ§ãåäžãããä¿å®æ§ãé«ããããšãã§ããŸããéåæããã°ã©ãã³ã°ã¯çŸä»£ã®JavaScriptéçºã§ãŸããŸãæ®åããŠãããAsync Iterator Helpersã¯è€éãªããŒã¿æäœã¿ã¹ã¯ã«åãçµãããã®è²ŽéãªããŒã«ã»ãããæäŸããŸãããããã®ãã«ããŒãæçããããåºãæ¡çšãããã«ã€ããŠãéåæJavaScriptéçºã®æªæ¥ã圢äœãäžã§ééããªãéèŠãªåœ¹å²ãæããã§ããããäžçäžã®éçºè ãããå¹ççã§ãã¹ã±ãŒã©ãã«ã§ãå ç¢ãªã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ã§ããããã«ãªããŸãããããã®ããŒã«ã广çã«çè§£ãæŽ»çšããããšã§ãéçºè ã¯ã¹ããªãŒã åŠçã®æ°ããªå¯èœæ§ãåãéããå¹ åºãã¢ããªã±ãŒã·ã§ã³åãã®é©æ°çãªãœãªã¥ãŒã·ã§ã³ãçã¿åºãããšãã§ããŸãã