Async Iterator Helper Resource Engineã䜿çšããŠãJavaScriptã§ã®éåæãªãœãŒã¹ç®¡çããã¹ã¿ãŒããŸããã¢ãã³ãªWebã¢ããªã±ãŒã·ã§ã³ã®ããã®ã¹ããªãŒã åŠçããšã©ãŒãã³ããªã³ã°ãããã©ãŒãã³ã¹æé©åãåŠã³ãŸãããã
JavaScript Async Iterator Helper Resource Engine: éåæã¹ããªãŒã ãªãœãŒã¹ç®¡ç
éåæããã°ã©ãã³ã°ã¯ãçŸä»£ã®JavaScriptéçºã®ç€ã§ãããã¡ã€ã³ã¹ã¬ããããããã¯ããããšãªãI/Oæäœãè€éãªããŒã¿ãããŒãå¹ççã«åŠçããããšãå¯èœã«ããŸããAsync Iterator Helper Resource Engineã¯ãéåæãªãœãŒã¹ãç¹ã«ããŒã¿ã¹ããªãŒã ãæ±ãéã«ã匷åã§æè»ãªããŒã«ããããæäŸããŸãããã®èšäºã§ã¯ããã®ãšã³ãžã³ã®æŠå¿µãæ©èœãããã³å®è·µçãªå¿çšã«ã€ããŠæãäžããå ç¢ã§ããã©ãŒãã³ã¹ã®é«ãéåæã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®ç¥èãæäŸããŸãã
éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã®çè§£
ãšã³ãžã³èªäœã«é£ã³èŸŒãåã«ãéåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã®åºæ¬çãªæŠå¿µãçè§£ããããšãéèŠã§ããåŸæ¥ã®åæããã°ã©ãã³ã°ã§ã¯ãã€ãã¬ãŒã¿ã¯ã·ãŒã±ã³ã¹ã®èŠçŽ ã«äžåºŠã«äžã€ãã€ã¢ã¯ã»ã¹ããæ¹æ³ãæäŸããŸããéåæã€ãã¬ãŒã¿ã¯ããã®æŠå¿µãéåææäœã«æ¡åŒµããããã«ã¯å©çšã§ããªãå¯èœæ§ã®ããã¹ããªãŒã ããå€ãååŸã§ããããã«ããŸãã
éåæã€ãã¬ãŒã¿ã¯ãnext()
ã¡ãœãããå®è£
ãããªããžã§ã¯ãã§ãããã®ã¡ãœããã¯ã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ãã«è§£æ±ºãããPromiseãè¿ããŸãïŒ
value
: ã·ãŒã±ã³ã¹å ã®æ¬¡ã®å€ãdone
: ã·ãŒã±ã³ã¹ãå°œãããã©ããã瀺ãããŒã«å€ã
éåæãžã§ãã¬ãŒã¿ã¯ãasync
ãšyield
ããŒã¯ãŒãã䜿çšããŠéåæã®å€ã®ã·ãŒã±ã³ã¹ãçæãã颿°ã§ããããã¯èªåçã«éåæã€ãã¬ãŒã¿ãªããžã§ã¯ããäœæããŸãã
以äžã¯ã1ãã5ãŸã§ã®æ°å€ãçæããéåæãžã§ãã¬ãŒã¿ã®ç°¡åãªäŸã§ãïŒ
async function* numberGenerator(limit) {
for (let i = 1; i <= limit; i++) {
await new Promise(resolve => setTimeout(resolve, 100)); // éåææäœãã·ãã¥ã¬ãŒã
yield i;
}
}
// 䜿çšäŸïŒ
(async () => {
for await (const number of numberGenerator(5)) {
console.log(number);
}
})();
ãªãœãŒã¹ãšã³ãžã³ãå¿ èŠãªçç±
éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã¯ãéåæããŒã¿ãæ±ãããã®åŒ·åãªã¡ã«ããºã ãæäŸããŸããããªãœãŒã¹ã广çã«ç®¡çããäžã§èª²é¡ãçããããŸããäŸãã°ã以äžã®ãããªããšãå¿ èŠã«ãªãå ŽåããããŸãïŒ
- ã¿ã€ã ãªãŒãªã¯ãªãŒã³ã¢ããã®ä¿èšŒïŒ ãšã©ãŒãçºçããå Žåã§ããã¹ããªãŒã ãäžèŠã«ãªã£ããšãã«ãã¡ã€ã«ãã³ãã«ãããŒã¿ããŒã¹æ¥ç¶ããããã¯ãŒã¯ãœã±ãããªã©ã®ãªãœãŒã¹ãè§£æŸããã
- ãšã©ãŒã®åªé ãªåŠçïŒ ã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ãããããšãªããéåææäœããã®ãšã©ãŒãäŒæãããã
- ããã©ãŒãã³ã¹ã®æé©åïŒ ããŒã¿ããã£ã³ã¯ã§åŠçããäžèŠãªãããã¡ãªã³ã°ãé¿ããããšã§ãã¡ã¢ãªäœ¿çšéãšé å»¶ãæå°éã«æããã
- ãã£ã³ã»ã«ãµããŒãã®æäŸïŒ ã³ã³ã·ã¥ãŒããã¹ããªãŒã ãããå¿ èŠãšããªãããšãéç¥ããããã«å¿ããŠãªãœãŒã¹ãè§£æŸã§ããããã«ããã
Async Iterator Helper Resource Engineã¯ãéåæãªãœãŒã¹ç®¡çãç°¡çŽ åããäžé£ã®ãŠãŒãã£ãªãã£ãšæœè±¡åãæäŸããããšã§ããããã®èª²é¡ã«å¯ŸåŠããŸãã
Async Iterator Helper Resource Engineã®äž»ãªæ©èœ
ãã®ãšã³ãžã³ã¯éåžžã以äžã®æ©èœãæäŸããŸãïŒ
1. ãªãœãŒã¹ã®ååŸãšè§£æŸ
ãšã³ãžã³ã¯ããªãœãŒã¹ãéåæã€ãã¬ãŒã¿ã«é¢é£ä»ããã¡ã«ããºã ãæäŸããŸããã€ãã¬ãŒã¿ãæ¶è²»ããããããšã©ãŒãçºçããããããšããšã³ãžã³ã¯é¢é£ãããªãœãŒã¹ãå¶åŸ¡ãããäºæž¬å¯èœãªæ¹æ³ã§è§£æŸãããããšãä¿èšŒããŸãã
äŸïŒãã¡ã€ã«ã¹ããªãŒã ã®ç®¡ç
const fs = require('fs').promises;
async function* readFileLines(filePath) {
let fileHandle;
try {
fileHandle = await fs.open(filePath, 'r');
const stream = fileHandle.createReadStream({ encoding: 'utf8' });
const reader = stream.pipeThrough(new TextDecoderStream()).pipeThrough(new LineStream());
for await (const line of reader) {
yield line;
}
} finally {
if (fileHandle) {
await fileHandle.close();
}
}
}
// äœ¿çšæ³ïŒ
(async () => {
try {
for await (const line of readFileLines('data.txt')) {
console.log(line);
}
} catch (error) {
console.error('ãã¡ã€ã«ã®èªã¿åããšã©ãŒïŒ', error);
}
})();
//ãã®äŸã§ã¯ã'fs'ã¢ãžã¥ãŒã«ãå©çšããŠéåæã«ãã¡ã€ã«ãéããäžè¡ãã€èªã¿åããŸãã
//'try...finally'ãããã¯ã«ãããèªã¿åãäžã«ãšã©ãŒãçºçããå Žåã§ããã¡ã€ã«ã確å®ã«éããããŸãã
ããã¯ç°¡çŽ åãããã¢ãããŒãã瀺ããŠããŸãããªãœãŒã¹ãšã³ãžã³ã¯ããã®ããã»ã¹ã管çããããã®ããæœè±¡çã§åå©çšå¯èœãªæ¹æ³ãæäŸããæœåšçãªãšã©ãŒããã£ã³ã»ã«ã·ã°ãã«ããããšã¬ã¬ã³ãã«åŠçããŸãã
2. ãšã©ãŒãã³ããªã³ã°ãšäŒæ
ãšã³ãžã³ã¯å ç¢ãªãšã©ãŒãã³ããªã³ã°æ©èœãæäŸããéåææäœäžã«çºçãããšã©ãŒããã£ããããŠåŠçããããšãã§ããŸãããŸãããšã©ãŒãã€ãã¬ãŒã¿ã®ã³ã³ã·ã¥ãŒãã«äŒæãããããšãä¿èšŒããäœããééã£ãŠããããšãæç¢ºã«ç€ºããŸãã
äŸïŒAPIãªã¯ãšã¹ãã§ã®ãšã©ãŒãã³ããªã³ã°
async function* fetchUsers(url) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹ïŒ ${response.status}`);
}
const data = await response.json();
for (const user of data) {
yield user;
}
} catch (error) {
console.error('ãŠãŒã¶ãŒã®ååŸãšã©ãŒïŒ', error);
throw error; // ãšã©ãŒãåã¹ããŒããŠäŒæããã
}
}
// äœ¿çšæ³ïŒ
(async () => {
try {
for await (const user of fetchUsers('https://api.example.com/users')) {
console.log(user);
}
} catch (error) {
console.error('ãŠãŒã¶ãŒã®åŠçã«å€±æããŸããïŒ', error);
}
})();
//ãã®äŸã¯ãAPIããããŒã¿ãååŸããéã®ãšã©ãŒãã³ããªã³ã°ã瀺ããŠããŸãã
//'try...catch'ãããã¯ã¯ããã§ããæäœäžã«çºçããå¯èœæ§ã®ãããšã©ãŒãææããŸãã
//ãšã©ãŒã¯åã¹ããŒãããåŒã³åºãå
ã®é¢æ°ã倱æãèªèã§ããããã«ããŸãã
3. ãã£ã³ã»ã«ãµããŒã
ãšã³ãžã³ã¯ãã³ã³ã·ã¥ãŒããã¹ããªãŒã åŠçæäœããã£ã³ã»ã«ããé¢é£ãããªãœãŒã¹ãè§£æŸããŠããã以äžã®ããŒã¿ãçæãããã®ãé²ãããšãå¯èœã«ããŸããããã¯ãé·æéå®è¡ãããã¹ããªãŒã ãæ±ãå Žåããã³ã³ã·ã¥ãŒããããŒã¿ãå¿ èŠãšããªããªã£ãå Žåã«ç¹ã«åœ¹ç«ã¡ãŸãã
äŸïŒAbortControllerã䜿çšãããã£ã³ã»ã«ã®å®è£
async function* fetchData(url, signal) {
try {
const response = await fetch(url, { signal });
if (!response.ok) {
throw new Error(`HTTPãšã©ãŒïŒã¹ããŒã¿ã¹ïŒ ${response.status}`);
}
const reader = response.body.getReader();
try {
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
yield value;
}
} finally {
reader.releaseLock();
}
} catch (error) {
if (error.name === 'AbortError') {
console.log('ãã§ãããäžæ¢ãããŸãã');
} else {
console.error('ããŒã¿ã®ååŸãšã©ãŒïŒ', error);
throw error;
}
}
}
// äœ¿çšæ³ïŒ
(async () => {
const controller = new AbortController();
const signal = controller.signal;
setTimeout(() => {
controller.abort(); // 3ç§åŸã«ãã§ããããã£ã³ã»ã«
}, 3000);
try {
for await (const chunk of fetchData('https://example.com/large-data', signal)) {
console.log('åä¿¡ãããã£ã³ã¯ïŒ', chunk);
}
} catch (error) {
console.error('ããŒã¿åŠçã«å€±æããŸããïŒ', error);
}
})();
//ãã®äŸã¯ãAbortControllerã䜿çšãããã£ã³ã»ã«ã瀺ããŠããŸãã
//AbortControllerã«ããããã§ããæäœããã£ã³ã»ã«ãã¹ãããšãéç¥ã§ããŸãã
//'fetchData'颿°ã¯'AbortError'ããã§ãã¯ããé©åã«åŠçããŸãã
4. ãããã¡ãªã³ã°ãšããã¯ãã¬ãã·ã£ãŒ
ãšã³ãžã³ã¯ãããã©ãŒãã³ã¹ãæé©åããã¡ã¢ãªã®åé¡ãé²ãããã®ãããã¡ãªã³ã°ãšããã¯ãã¬ãã·ã£ãŒã®ã¡ã«ããºã ãæäŸã§ããŸãããããã¡ãªã³ã°ã«ãããããŒã¿ãåŠçããåã«èç©ããããšãã§ããããã¯ãã¬ãã·ã£ãŒã«ãããã³ã³ã·ã¥ãŒãã¯ãããã¥ãŒãµãŒã«å¯ŸããŠããã以äžããŒã¿ãåãåãæºåãã§ããŠããªãããšãéç¥ã§ããŸãã
äŸïŒåçŽãªãããã¡ã®å®è£
async function* bufferedStream(source, bufferSize) {
const buffer = [];
for await (const item of source) {
buffer.push(item);
if (buffer.length >= bufferSize) {
yield buffer.splice(0, bufferSize);
}
}
if (buffer.length > 0) {
yield buffer;
}
}
// 䜿çšäŸïŒ
(async () => {
async function* generateNumbers() {
for (let i = 1; i <= 10; i++) {
await new Promise(resolve => setTimeout(resolve, 50));
yield i;
}
}
for await (const chunk of bufferedStream(generateNumbers(), 3)) {
console.log('ãã£ã³ã¯ïŒ', chunk);
}
})();
//ãã®äŸã¯ãåçŽãªãããã¡ãªã³ã°ã¡ã«ããºã ã瀺ããŠããŸãã
//'bufferedStream'颿°ã¯ããœãŒã¹ã¹ããªãŒã ããã¢ã€ãã ããããã¡ã«åéããŸãã
//ãããã¡ãæå®ããããµã€ãºã«éãããšããããã¡ã®å
容ãçæããŸãã
Async Iterator Helper Resource Engineã䜿çšããã¡ãªãã
Async Iterator Helper Resource Engineã䜿çšããããšã«ã¯ãããã€ãã®å©ç¹ããããŸãïŒ
- ç°¡çŽ åããããªãœãŒã¹ç®¡çïŒ éåæãªãœãŒã¹ç®¡çã®è€éããæœè±¡åããå ç¢ã§ä¿¡é Œæ§ã®é«ãã³ãŒããç°¡åã«èšè¿°ã§ããããã«ããŸãã
- ã³ãŒãã®å¯èªæ§ã®åäžïŒ ãªãœãŒã¹ã管çããããã®æç¢ºã§ç°¡æœãªAPIãæäŸããã³ãŒãã®çè§£ãšä¿å®ã容æã«ããŸãã
- 匷åããããšã©ãŒãã³ããªã³ã°ïŒ å ç¢ãªãšã©ãŒãã³ããªã³ã°æ©èœãæäŸãããšã©ãŒã確å®ã«ãã£ãããããåªé ã«åŠçãããããã«ããŸãã
- æé©åãããããã©ãŒãã³ã¹ïŒ ããã©ãŒãã³ã¹ãæé©åããã¡ã¢ãªã®åé¡ãé²ãããã®ãããã¡ãªã³ã°ãšããã¯ãã¬ãã·ã£ãŒã®ã¡ã«ããºã ãæäŸããŸãã
- åå©çšæ§ã®åäžïŒ ã¢ããªã±ãŒã·ã§ã³ã®ããŸããŸãªéšåã«ç°¡åã«çµ±åã§ããåå©çšå¯èœãªã³ã³ããŒãã³ããæäŸããŸãã
- ãã€ã©ãŒãã¬ãŒãã®åæžïŒ ãªãœãŒã¹ç®¡çã®ããã«èšè¿°ããå¿ èŠã®ããå埩çãªã³ãŒãã®éãæå°éã«æããŸãã
å®è·µçãªå¿çšäŸ
Async Iterator Helper Resource Engineã¯ã以äžã®ãããªããŸããŸãªã·ããªãªã§äœ¿çšã§ããŸãïŒ
- ãã¡ã€ã«åŠçïŒ å€§å®¹éãã¡ã€ã«ã®éåæèªã¿æžãã
- ããŒã¿ããŒã¹ã¢ã¯ã»ã¹ïŒ ããŒã¿ããŒã¹ã®ã¯ãšãªãšçµæã®ã¹ããªãŒãã³ã°ã
- ãããã¯ãŒã¯éä¿¡ïŒ ãããã¯ãŒã¯ãªã¯ãšã¹ããšã¬ã¹ãã³ã¹ã®åŠçã
- ããŒã¿ãã€ãã©ã€ã³ïŒ ããŒã¿ããã£ã³ã¯ã§åŠçããããŒã¿ãã€ãã©ã€ã³ã®æ§ç¯ã
- ãªã¢ã«ã¿ã€ã ã¹ããªãŒãã³ã°ïŒ ãªã¢ã«ã¿ã€ã ã¹ããªãŒãã³ã°ã¢ããªã±ãŒã·ã§ã³ã®å®è£ ã
äŸïŒIoTããã€ã¹ããã®ã»ã³ãµãŒããŒã¿ãåŠçããããã®ããŒã¿ãã€ãã©ã€ã³ã®æ§ç¯
äœåãã®IoTããã€ã¹ããããŒã¿ãåéããŠããã·ããªãªãæ³åããŠã¿ãŠãã ãããåããã€ã¹ã¯å®æçã«ããŒã¿ãã€ã³ããéä¿¡ãããã®ããŒã¿ããªã¢ã«ã¿ã€ã ã§åŠçããŠç°åžžãæ€åºããã¢ã©ãŒããçæããå¿ èŠããããŸãã
// IoTããã€ã¹ããã®ããŒã¿ã¹ããªãŒã ãã·ãã¥ã¬ãŒã
async function* simulateIoTData(numDevices, intervalMs) {
let deviceId = 1;
while (true) {
await new Promise(resolve => setTimeout(resolve, intervalMs));
const deviceData = {
deviceId: deviceId,
temperature: 20 + Math.random() * 15, // 枩床ã¯20ãã35ã®é
humidity: 50 + Math.random() * 30, // 湿床ã¯50ãã80ã®é
timestamp: new Date().toISOString(),
};
yield deviceData;
deviceId = (deviceId % numDevices) + 1; // ããã€ã¹ã埪ç°ããã
}
}
// ç°åžžãæ€åºãã颿°ïŒç°¡ç¥åãããäŸïŒ
function detectAnomalies(data) {
const { temperature, humidity } = data;
if (temperature > 32 || humidity > 75) {
return { ...data, anomaly: true };
}
return { ...data, anomaly: false };
}
// ããŒã¿ãããŒã¿ããŒã¹ã«ãã°èšé²ãã颿°ïŒå®éã®ããŒã¿ããŒã¹æäœã«çœ®ãæããïŒ
async function logData(data) {
// éåæããŒã¿ããŒã¹æžã蟌ã¿ãã·ãã¥ã¬ãŒã
await new Promise(resolve => setTimeout(resolve, 10));
console.log('ããŒã¿ããã°èšé²äžïŒ', data);
}
// ã¡ã€ã³ã®ããŒã¿ãã€ãã©ã€ã³
(async () => {
const numDevices = 5;
const intervalMs = 500;
const dataStream = simulateIoTData(numDevices, intervalMs);
try {
for await (const rawData of dataStream) {
const processedData = detectAnomalies(rawData);
await logData(processedData);
}
} catch (error) {
console.error('ãã€ãã©ã€ã³ãšã©ãŒïŒ', error);
}
})();
//ãã®äŸã¯ãIoTããã€ã¹ããã®ããŒã¿ã¹ããªãŒã ãã·ãã¥ã¬ãŒãããç°åžžãæ€åºããããŒã¿ããã°ã«èšé²ããŸãã
//éåæã€ãã¬ãŒã¿ã䜿çšããŠç°¡åãªããŒã¿ãã€ãã©ã€ã³ãæ§ç¯ããæ¹æ³ã瀺ããŠããŸãã
//å®éã®ã·ããªãªã§ã¯ãã·ãã¥ã¬ãŒãããã颿°ãå®éã®ããŒã¿ãœãŒã¹ãç°åžžæ€åºã¢ã«ãŽãªãºã ãããã³ããŒã¿ããŒã¹æäœã«çœ®ãæããŸãã
ãã®äŸã§ã¯ããšã³ãžã³ã䜿çšããŠIoTããã€ã¹ããã®ããŒã¿ã¹ããªãŒã ã管çããã¹ããªãŒã ãäžèŠã«ãªã£ããšãã«ãªãœãŒã¹ãè§£æŸããããšã©ãŒãåªé ã«åŠçãããããšãä¿èšŒã§ããŸãããŸããããã¯ãã¬ãã·ã£ãŒãå®è£ ããŠãããŒã¿ã¹ããªãŒã ãåŠçãã€ãã©ã€ã³ãå§åããã®ãé²ãããã«ã䜿çšã§ããŸãã
é©åãªãšã³ãžã³ã®éžæ
ããã€ãã®ã©ã€ãã©ãªãAsync Iterator Helper Resource Engineã®æ©èœãæäŸããŠããŸãããšã³ãžã³ãéžæããéã«ã¯ã以äžã®èŠçŽ ãèæ ®ããŠãã ããïŒ
- æ©èœïŒ ãªãœãŒã¹ã®ååŸãšè§£æŸããšã©ãŒãã³ããªã³ã°ããã£ã³ã»ã«ãµããŒãããããã¡ãªã³ã°ãããã¯ãã¬ãã·ã£ãŒãªã©ãå¿ èŠãªæ©èœãæäŸããŠãããïŒ
- ããã©ãŒãã³ã¹ïŒ ãšã³ãžã³ã¯ããã©ãŒãã³ã¹ãé«ãå¹ççãïŒã¡ã¢ãªäœ¿çšéãšé å»¶ãæå°éã«æããŠãããïŒ
- 䜿ããããïŒ ãšã³ãžã³ã¯äœ¿ãããããã¢ããªã±ãŒã·ã§ã³ã«çµ±åãããããïŒæç¢ºã§ç°¡æœãªAPIãæäŸããŠãããïŒ
- ã³ãã¥ããã£ãµããŒãïŒ ãšã³ãžã³ã«ã¯å€§èŠæš¡ã§æŽ»çºãªã³ãã¥ããã£ããããïŒååã«ææžåããããµããŒããããŠãããïŒ
- äŸåé¢ä¿ïŒ ãšã³ãžã³ã®äŸåé¢ä¿ã¯äœãïŒæ¢åã®ããã±ãŒãžãšç«¶åããå¯èœæ§ã¯ãããïŒ
- ã©ã€ã»ã³ã¹ïŒ ãšã³ãžã³ã®ã©ã€ã»ã³ã¹ã¯äœãïŒãããžã§ã¯ããšäºææ§ããããïŒ
åæ§ã®æ©èœãæäŸããç¬èªã®ãšã³ãžã³ãæ§ç¯ããéã®åèã«ãªã人æ°ã®ããã©ã€ãã©ãªã«ã¯ã以äžã®ãããªãã®ããããŸãïŒãã ãããããã¯ãã®æŠå¿µã«ãããäŸåé¢ä¿ã§ã¯ãããŸããïŒïŒ
- Itertools.js: éåæãå«ããããŸããŸãªã€ãã¬ãŒã¿ããŒã«ãæäŸããŸãã
- Highland.js: ã¹ããªãŒã åŠçãŠãŒãã£ãªãã£ãæäŸããŸãã
- RxJS: éåæã¹ããªãŒã ãæ±ãããªã¢ã¯ãã£ãããã°ã©ãã³ã°ã©ã€ãã©ãªã§ãã
ç¬èªã®ãªãœãŒã¹ãšã³ãžã³ã®æ§ç¯
æ¢åã®ã©ã€ãã©ãªã掻çšããããšã¯å€ãã®å Žåæçã§ããããªãœãŒã¹ç®¡çã®èåŸã«ããååãçè§£ããããšã§ãç¹å®ã®ããŒãºã«åãããã«ã¹ã¿ã ãœãªã¥ãŒã·ã§ã³ãæ§ç¯ã§ããŸããåºæ¬çãªãªãœãŒã¹ãšã³ãžã³ã«ã¯ã以äžãå«ãŸããå¯èœæ§ããããŸãïŒ
- ãªãœãŒã¹ã©ãããŒïŒ ãªãœãŒã¹ïŒäŸïŒãã¡ã€ã«ãã³ãã«ãæ¥ç¶ïŒãã«ãã»ã«åãããããååŸããã³è§£æŸããããã®ã¡ãœãããæäŸãããªããžã§ã¯ãã
- éåæã€ãã¬ãŒã¿ãã³ã¬ãŒã¿ïŒ æ¢åã®éåæã€ãã¬ãŒã¿ãåãåãããªãœãŒã¹ç®¡çããžãã¯ã§ã©ãããã颿°ããã®ãã³ã¬ãŒã¿ã¯ãã€ãã¬ãŒã·ã§ã³ã®åã«ãªãœãŒã¹ãååŸãããåŸïŒãŸãã¯ãšã©ãŒæïŒã«è§£æŸãããããšãä¿èšŒããŸãã
- ãšã©ãŒãã³ããªã³ã°ïŒ ã€ãã¬ãŒã·ã§ã³äžããã³ãªãœãŒã¹è§£æŸäžã®äŸå€ããã£ããããããã«ããã³ã¬ãŒã¿å ã«å ç¢ãªãšã©ãŒãã³ããªã³ã°ãå®è£ ããŸãã
- ãã£ã³ã»ã«ããžãã¯ïŒ AbortControllerãŸãã¯åæ§ã®ã¡ã«ããºã ãšçµ±åããå€éšã®ãã£ã³ã»ã«ã·ã°ãã«ãã€ãã¬ãŒã¿ãæ£åžžã«çµäºããããªãœãŒã¹ãè§£æŸã§ããããã«ããŸãã
éåæãªãœãŒã¹ç®¡çã®ãã¹ããã©ã¯ãã£ã¹
éåæã¢ããªã±ãŒã·ã§ã³ãå ç¢ã§ããã©ãŒãã³ã¹ãé«ãããšãä¿èšŒããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ã«åŸã£ãŠãã ããïŒ
- åžžã«ãªãœãŒã¹ãè§£æŸããïŒ ãšã©ãŒãçºçããå Žåã§ããäžèŠã«ãªã£ããªãœãŒã¹ã¯å¿
ãè§£æŸããŠãã ããã
try...finally
ãããã¯ãŸãã¯Async Iterator Helper Resource Engineã䜿çšããŠãã¿ã€ã ãªãŒãªã¯ãªãŒã³ã¢ãããä¿èšŒããŸãã - ãšã©ãŒãåªé ã«åŠçããïŒ éåææäœäžã«çºçãããšã©ãŒããã£ããããŠåŠçããŸãããšã©ãŒã¯ã€ãã¬ãŒã¿ã®ã³ã³ã·ã¥ãŒãã«äŒæãããŸãã
- ãããã¡ãªã³ã°ãšããã¯ãã¬ãã·ã£ãŒã䜿çšããïŒ ãããã¡ãªã³ã°ãšããã¯ãã¬ãã·ã£ãŒã䜿çšããŠãããã©ãŒãã³ã¹ãæé©åããã¡ã¢ãªã®åé¡ãé²ããŸãã
- ãã£ã³ã»ã«ãµããŒããå®è£ ããïŒ ã³ã³ã·ã¥ãŒããã¹ããªãŒã åŠçæäœããã£ã³ã»ã«ã§ããããã«ããŸãã
- ã³ãŒãã培åºçã«ãã¹ãããïŒ éåæã³ãŒãããã¹ãããŠãæ£ããåäœãããªãœãŒã¹ãé©åã«ç®¡çãããŠããããšã確èªããŸãã
- ãªãœãŒã¹äœ¿çšç¶æ³ãç£èŠããïŒ ããŒã«ã䜿çšããŠã¢ããªã±ãŒã·ã§ã³ã®ãªãœãŒã¹äœ¿çšç¶æ³ãç£èŠããæœåšçãªãªãŒã¯ãéå¹çæ§ãç¹å®ããŸãã
- å°çšã®ã©ã€ãã©ãªããšã³ãžã³ã®äœ¿çšãæ€èšããïŒ Async Iterator Helper Resource Engineã®ãããªã©ã€ãã©ãªã¯ããªãœãŒã¹ç®¡çãåçåãããã€ã©ãŒãã¬ãŒãã³ãŒããåæžã§ããŸãã
çµè«
Async Iterator Helper Resource Engineã¯ãJavaScriptã§éåæãªãœãŒã¹ã管çããããã®åŒ·åãªããŒã«ã§ãããªãœãŒã¹ã®ååŸãšè§£æŸããšã©ãŒãã³ããªã³ã°ãããã©ãŒãã³ã¹ã®æé©åãç°¡çŽ åããäžé£ã®ãŠãŒãã£ãªãã£ãšæœè±¡åãæäŸããããšã§ããã®ãšã³ãžã³ã¯å ç¢ã§ããã©ãŒãã³ã¹ã®é«ãéåæã¢ããªã±ãŒã·ã§ã³ã®æ§ç¯ã«åœ¹ç«ã¡ãŸãããã®èšäºã§æŠèª¬ããååãçè§£ãããã¹ããã©ã¯ãã£ã¹ãé©çšããããšã§ãéåæããã°ã©ãã³ã°ã®åãæŽ»çšããŠãå¹ åºãåé¡ã«å¯Ÿããå¹ççã§ã¹ã±ãŒã©ãã«ãªãœãªã¥ãŒã·ã§ã³ãäœæã§ããŸããé©åãªãšã³ãžã³ãéžæããããç¬èªã«å®è£ ãããã¯ããããžã§ã¯ãã®ç¹å®ã®ããŒãºãšå¶çŽãæ éã«æ€èšããå¿ èŠããããŸããæçµçã«ãéåæãªãœãŒã¹ç®¡çãç¿åŸããããšã¯ãçŸä»£ã®JavaScriptéçºè ã«ãšã£ãŠéèŠãªã¹ãã«ã§ãã