JavaScriptéåæã€ãã¬ãŒã¿ããã¹ã¿ãŒããå¹ççãªãªãœãŒã¹ç®¡çãšã¹ããªãŒã ã¯ãªãŒã³ã¢ããã®èªååãå®çŸããŸããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®ãã¹ããã©ã¯ãã£ã¹ãé«åºŠãªãã¯ããã¯ããããŠå®äŸãåŠã³ãŸãããã
JavaScriptéåæã€ãã¬ãŒã¿ã®ãªãœãŒã¹ç®¡çïŒã¹ããªãŒã ã¯ãªãŒã³ã¢ããã®èªåå
éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã¯ãããŒã¿ã¹ããªãŒã ãéåææäœãå¹ççã«æ±ãããã®JavaScriptã®åŒ·åãªæ©èœã§ããããããéåæç°å¢ã§ã®ãªãœãŒã¹ç®¡çãšé©åãªã¯ãªãŒã³ã¢ããã®ä¿èšŒã¯å°é£ãªå ŽåããããŸããæ³šæãæ ããšãã¡ã¢ãªãªãŒã¯ãéããããŠããªãæ¥ç¶ããã®ä»ã®ãªãœãŒã¹é¢é£ã®åé¡ã«ã€ãªããå¯èœæ§ããããŸãããã®èšäºã§ã¯ãJavaScriptéåæã€ãã¬ãŒã¿ã«ãããã¹ããªãŒã ã¯ãªãŒã³ã¢ãããèªååãããã¯ããã¯ãæ¢æ±ããå ç¢ã§ã¹ã±ãŒã©ãã«ãªã¢ããªã±ãŒã·ã§ã³ãä¿èšŒããããã®ãã¹ããã©ã¯ãã£ã¹ãšå®çšçãªäŸãæäŸããŸãã
éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã®çè§£
ãªãœãŒã¹ç®¡çã«èžã¿èŸŒãåã«ãéåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ã®åºæ¬ãããããããŸãããã
éåæã€ãã¬ãŒã¿
éåæã€ãã¬ãŒã¿ã¯ãnext()
ã¡ãœãããå®çŸ©ãããªããžã§ã¯ãã§ãããã®ã¡ãœããã¯ã2ã€ã®ããããã£ãæã€ãªããžã§ã¯ãã«è§£æ±ºããããããã¹ãè¿ããŸãã
value
: ã·ãŒã±ã³ã¹ã®æ¬¡ã®å€ãdone
: ã€ãã¬ãŒã¿ãå®äºãããã©ããã瀺ãããŒã«å€ã
éåæã€ãã¬ãŒã¿ã¯ãAPIã¬ã¹ãã³ã¹ããã¡ã€ã«ã¹ããªãŒã ãªã©ã®éåæããŒã¿ãœãŒã¹ãåŠçããããã«ãã䜿çšãããŸãã
äŸïŒ
async function* asyncIterable() {
yield 1;
yield 2;
yield 3;
}
async function main() {
for await (const value of asyncIterable()) {
console.log(value);
}
}
main(); // åºå: 1, 2, 3
éåæãžã§ãã¬ãŒã¿
éåæãžã§ãã¬ãŒã¿ã¯ãéåæã€ãã¬ãŒã¿ãè¿ã颿°ã§ããasync function*
æ§æãšyield
ããŒã¯ãŒãã䜿çšããŠãéåæã«å€ãçæããŸãã
äŸïŒ
async function* generateSequence(start, end) {
for (let i = start; i <= end; i++) {
await new Promise(resolve => setTimeout(resolve, 500)); // éåææäœãã·ãã¥ã¬ãŒã
yield i;
}
}
async function main() {
for await (const value of generateSequence(1, 5)) {
console.log(value);
}
}
main(); // åºå: 1, 2, 3, 4, 5 (åå€ã®éã«500msã®é
å»¶ãã)
課é¡ïŒéåæã¹ããªãŒã ã«ããããªãœãŒã¹ç®¡ç
éåæã¹ããªãŒã ãæ±ãéã«ã¯ããªãœãŒã¹ã广çã«ç®¡çããããšãäžå¯æ¬ ã§ãããªãœãŒã¹ã«ã¯ããã¡ã€ã«ãã³ãã«ãããŒã¿ããŒã¹æ¥ç¶ããããã¯ãŒã¯ãœã±ãããªã©ãã¹ããªãŒã ã®ã©ã€ããµã€ã¯ã«äžã«ååŸã»è§£æŸããå¿ èŠãããå€éšãªãœãŒã¹ãå«ãŸããŸãããããã®ãªãœãŒã¹ãé©åã«ç®¡çããªããšã次ã®ãããªåé¡ãçºçããå¯èœæ§ããããŸãã
- ã¡ã¢ãªãªãŒã¯: äžèŠã«ãªã£ããªãœãŒã¹ãè§£æŸããããæéãšãšãã«ã¡ã¢ãªæ¶è²»éãå¢å ããŸãã
- éããããŠããªãæ¥ç¶: ããŒã¿ããŒã¹ããããã¯ãŒã¯ã®æ¥ç¶ãéãããŸãŸã«ãªããæ¥ç¶å¶éã䜿ãæãããããã©ãŒãã³ã¹ã®åé¡ããšã©ãŒãåŒãèµ·ããå¯èœæ§ããããŸãã
- ãã¡ã€ã«ãã³ãã«ã®æ¯æž: éããããã¡ã€ã«ãã³ãã«ãèç©ããã¢ããªã±ãŒã·ã§ã³ãããã«ãã¡ã€ã«ãéãããšãããšãšã©ãŒãçºçããŸãã
- äºæž¬äžèœãªåäœ: äžé©åãªãªãœãŒã¹ç®¡çã¯ãäºæãã¬ãšã©ãŒãã¢ããªã±ãŒã·ã§ã³ã®äžå®å®åã«ã€ãªããå¯èœæ§ããããŸãã
ç¹ã«ãšã©ãŒãã³ããªã³ã°ã䌎ãéåæã³ãŒãã®è€éãã¯ããªãœãŒã¹ç®¡çãå°é£ã«ããå¯èœæ§ããããŸããã¹ããªãŒã åŠçäžã«ãšã©ãŒãçºçããå Žåã§ãããªãœãŒã¹ãåžžã«è§£æŸãããããã«ããããšãéèŠã§ãã
ã¹ããªãŒã ã¯ãªãŒã³ã¢ããã®èªååïŒãã¯ããã¯ãšãã¹ããã©ã¯ãã£ã¹
éåæã€ãã¬ãŒã¿ã«ããããªãœãŒã¹ç®¡çã®èª²é¡ã«å¯ŸåŠãããããã¹ããªãŒã ã¯ãªãŒã³ã¢ãããèªååããããã®ããã€ãã®ãã¯ããã¯ãå©çšã§ããŸãã
1. try...finally
ãããã¯
try...finally
ãããã¯ã¯ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ããã確å®ã«è¡ãããã®åºæ¬çãªã¡ã«ããºã ã§ããfinally
ãããã¯ã¯ãtry
ãããã¯ã§ãšã©ãŒãçºçãããã©ããã«é¢ããããåžžã«å®è¡ãããŸãã
äŸïŒ
async function* readFileLines(filePath) {
let fileHandle;
try {
fileHandle = await fs.open(filePath, 'r');
const stream = fileHandle.readableWebStream();
const reader = stream.getReader();
let decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
yield decoder.decode(value);
}
} finally {
if (fileHandle) {
await fileHandle.close();
console.log('ãã¡ã€ã«ãã³ãã«ãéããããŸããã');
}
}
}
async function main() {
try{
for await (const line of readFileLines('example.txt')) {
console.log(line);
}
} catch (error) {
console.error('ãã¡ã€ã«èªã¿èŸŒã¿ãšã©ãŒ:', error);
}
}
main();
ãã®äŸã§ã¯ãfinally
ãããã¯ã«ãã£ãŠããã¡ã€ã«ã®èªã¿èŸŒã¿äžã«ãšã©ãŒãçºçããå Žåã§ãããã¡ã€ã«ãã³ãã«ãåžžã«éããããããšãä¿èšŒãããŸãã
2. Symbol.asyncDispose
ã®äœ¿çš (æç€ºçãªãªãœãŒã¹ç®¡çã®ææ¡)
ãæç€ºçãªãªãœãŒã¹ç®¡çãã®ææ¡ã§ã¯ãSymbol.asyncDispose
ã·ã³ãã«ãå°å
¥ãããŸãããããã«ããããªããžã§ã¯ããäžèŠã«ãªã£ããšãã«èªåçã«åŒã³åºãããã¡ãœãããå®çŸ©ã§ããŸããããã¯ãC#ã®using
ã¹ããŒãã¡ã³ããJavaã®try-with-resources
ã¹ããŒãã¡ã³ãã«äŒŒãŠããŸãã
ãã®æ©èœã¯ãŸã ææ¡æ®µéã§ããããªãœãŒã¹ç®¡çã«å¯ŸããŠããã¯ãªãŒã³ã§æ§é åãããã¢ãããŒããæäŸããŸãã
çŸåšã®ç°å¢ã§ããã䜿çšããããã®ããªãã£ã«ãå©çšå¯èœã§ãã
äŸ (æ¶ç©ºã®ããªãã£ã«ã䜿çš)ïŒ
import { using } from 'resource-management-polyfill';
class MyResource {
constructor() {
console.log('ãªãœãŒã¹ãååŸãããŸããã');
}
async [Symbol.asyncDispose]() {
await new Promise(resolve => setTimeout(resolve, 100)); // éåæã¯ãªãŒã³ã¢ãããã·ãã¥ã¬ãŒã
console.log('ãªãœãŒã¹ãè§£æŸãããŸããã');
}
}
async function main() {
await using(new MyResource(), async (resource) => {
console.log('ãªãœãŒã¹ã䜿çšäž...');
// ... ãªãœãŒã¹ã䜿çš
}); // ããã§ãªãœãŒã¹ãèªåçã«ç Žæ£ãããŸã
console.log('usingãããã¯ã®åŸã');
}
main();
ãã®äŸã§ã¯ãusing
ã¹ããŒãã¡ã³ãã«ããããšã©ãŒãçºçãããã©ããã«é¢ãããããããã¯ãæããéã«MyResource
ãªããžã§ã¯ãã®[Symbol.asyncDispose]
ã¡ãœãããåŒã³åºãããããšãä¿èšŒãããŸããããã«ããã確å®çã§ä¿¡é Œæ§ã®é«ãæ¹æ³ã§ãªãœãŒã¹ãè§£æŸã§ããŸãã
3. ãªãœãŒã¹ã©ãããŒã®å®è£
å¥ã®ã¢ãããŒããšããŠããªãœãŒã¹ãšãã®ã¯ãªãŒã³ã¢ããããžãã¯ãã«ãã»ã«åãããªãœãŒã¹ã©ãããŒã¯ã©ã¹ãäœæããæ¹æ³ããããŸãããã®ã¯ã©ã¹ã¯ããªãœãŒã¹ã®ååŸãšè§£æŸã®ããã®ã¡ãœãããå®è£ ããã¯ãªãŒã³ã¢ãããåžžã«æ£ããå®è¡ãããããã«ããŸãã
äŸïŒ
class FileStreamResource {
constructor(filePath) {
this.filePath = filePath;
this.fileHandle = null;
}
async acquire() {
this.fileHandle = await fs.open(this.filePath, 'r');
console.log('ãã¡ã€ã«ãã³ãã«ãååŸãããŸããã');
return this.fileHandle.readableWebStream();
}
async release() {
if (this.fileHandle) {
await this.fileHandle.close();
console.log('ãã¡ã€ã«ãã³ãã«ãè§£æŸãããŸããã');
this.fileHandle = null;
}
}
}
async function* readFileLines(resource) {
try {
const stream = await resource.acquire();
const reader = stream.getReader();
let decoder = new TextDecoder();
while (true) {
const { done, value } = await reader.read();
if (done) {
break;
}
yield decoder.decode(value);
}
} finally {
await resource.release();
}
}
async function main() {
const fileResource = new FileStreamResource('example.txt');
try {
for await (const line of readFileLines(fileResource)) {
console.log(line);
}
} catch (error) {
console.error('ãã¡ã€ã«èªã¿èŸŒã¿ãšã©ãŒ:', error);
}
}
main();
ãã®äŸã§ã¯ãFileStreamResource
ã¯ã©ã¹ããã¡ã€ã«ãã³ãã«ãšãã®ã¯ãªãŒã³ã¢ããããžãã¯ãã«ãã»ã«åããŠããŸããreadFileLines
ãžã§ãã¬ãŒã¿ã¯ãã®ã¯ã©ã¹ã䜿çšããŠããšã©ãŒãçºçããå Žåã§ããã¡ã€ã«ãã³ãã«ãåžžã«è§£æŸãããããšãä¿èšŒããŸãã
4. ã©ã€ãã©ãªãšãã¬ãŒã ã¯ãŒã¯ã®æŽ»çš
å€ãã®ã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã¯ããªãœãŒã¹ç®¡çãšã¹ããªãŒã ã¯ãªãŒã³ã¢ããã®ããã®çµã¿èŸŒã¿ã¡ã«ããºã ãæäŸããŠããŸãããããã¯ããã»ã¹ãç°¡çŽ åãããšã©ãŒã®ãªã¹ã¯ãäœæžããããšãã§ããŸãã
- Node.js Streams API: Node.js Streams APIã¯ãã¹ããªãŒãã³ã°ããŒã¿ãæ±ãããã®å ç¢ã§å¹ççãªæ¹æ³ãæäŸããŸããããã¯ãã¬ãã·ã£ãŒã®ç®¡çãé©åãªã¯ãªãŒã³ã¢ãããä¿èšŒããã¡ã«ããºã ãå«ãŸããŠããŸãã
- RxJS (Reactive Extensions for JavaScript): RxJSã¯ãéåæããŒã¿ã¹ããªãŒã ã管çããããã®åŒ·åãªããŒã«ãæäŸãããªã¢ã¯ãã£ãããã°ã©ãã³ã°çšã®ã©ã€ãã©ãªã§ãããšã©ãŒåŠçãæäœã®ãªãã©ã€ããªãœãŒã¹ã¯ãªãŒã³ã¢ãããä¿èšŒãããªãã¬ãŒã¿ãå«ãŸããŠããŸãã
- èªåã¯ãªãŒã³ã¢ããæ©èœä»ãã©ã€ãã©ãª: äžéšã®ããŒã¿ããŒã¹ããããã¯ãŒã¯ã©ã€ãã©ãªã¯ãèªåçãªæ¥ç¶ããŒãªã³ã°ãšãªãœãŒã¹è§£æŸãåããŠèšèšãããŠããŸãã
äŸ (Node.js Streams APIã䜿çš)ïŒ
const fs = require('node:fs');
const { pipeline } = require('node:stream/promises');
const { Transform } = require('node:stream');
async function main() {
try {
await pipeline(
fs.createReadStream('example.txt'),
new Transform({
transform(chunk, encoding, callback) {
this.push(chunk.toString().toUpperCase());
callback();
}
}),
fs.createWriteStream('output.txt')
);
console.log('ãã€ãã©ã€ã³ãæåããŸããã');
} catch (err) {
console.error('ãã€ãã©ã€ã³ã倱æããŸããã', err);
}
}
main();
ãã®äŸã§ã¯ãpipeline
颿°ãã¹ããªãŒã ãèªåçã«ç®¡çããããããé©åã«éãããããšã©ãŒãæ£ããåŠçãããããšãä¿èšŒããŸãã
ãªãœãŒã¹ç®¡çã®ããã®é«åºŠãªãã¯ããã¯
åºæ¬çãªãã¯ããã¯ã«å ããŠãããã€ãã®é«åºŠãªæŠç¥ã«ãããéåæã€ãã¬ãŒã¿ã«ããããªãœãŒã¹ç®¡çãããã«åŒ·åã§ããŸãã
1. ãã£ã³ã»ã«ããŒã¯ã³
ãã£ã³ã»ã«ããŒã¯ã³ã¯ãéåææäœããã£ã³ã»ã«ããããã®ã¡ã«ããºã ãæäŸããŸããããã¯ããŠãŒã¶ãŒããªã¯ãšã¹ãããã£ã³ã»ã«ããå Žåãã¿ã€ã ã¢ãŠããçºçããå Žåãªã©ãæäœãäžèŠã«ãªã£ããšãã«ãªãœãŒã¹ãè§£æŸããã®ã«åœ¹ç«ã¡ãŸãã
äŸïŒ
class CancellationToken {
constructor() {
this.isCancelled = false;
this.listeners = [];
}
cancel() {
this.isCancelled = true;
for (const listener of this.listeners) {
listener();
}
}
register(listener) {
this.listeners.push(listener);
return () => {
this.listeners = this.listeners.filter(l => l !== listener);
};
}
}
async function* fetchData(url, cancellationToken) {
try {
const response = await fetch(url);
if (!response.ok) {
throw new Error(`HTTP error! Status: ${response.status}`);
}
const reader = response.body.getReader();
const decoder = new TextDecoder();
while (true) {
if (cancellationToken.isCancelled) {
console.log('ãã§ããããã£ã³ã»ã«ãããŸããã');
reader.cancel(); // ã¹ããªãŒã ããã£ã³ã»ã«
return;
}
const { done, value } = await reader.read();
if (done) {
break;
}
yield decoder.decode(value);
}
} catch (error) {
console.error('ããŒã¿ååŸãšã©ãŒ:', error);
}
}
async function main() {
const cancellationToken = new CancellationToken();
const url = 'https://example.com/data'; // æå¹ãªURLã«çœ®ãæããŠãã ãã
setTimeout(() => {
cancellationToken.cancel(); // 3ç§åŸã«ãã£ã³ã»ã«
}, 3000);
try {
for await (const chunk of fetchData(url, cancellationToken)) {
console.log(chunk);
}
} catch (error) {
console.error('ããŒã¿åŠçãšã©ãŒ:', error);
}
}
main();
ãã®äŸã§ã¯ãfetchData
ãžã§ãã¬ãŒã¿ããã£ã³ã»ã«ããŒã¯ã³ãåãåããŸããããŒã¯ã³ããã£ã³ã»ã«ããããšããžã§ãã¬ãŒã¿ã¯ãã§ãããªã¯ãšã¹ãããã£ã³ã»ã«ããé¢é£ãããªãœãŒã¹ãè§£æŸããŸãã
2. WeakRefãšFinalizationRegistry
WeakRef
ãšFinalizationRegistry
ã¯ããªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã远跡ãããªããžã§ã¯ããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ããããšãã«ã¯ãªãŒã³ã¢ãããå®è¡ã§ããããã«ããé«åºŠãªæ©èœã§ãããããã¯ãä»ã®ãªããžã§ã¯ãã®ã©ã€ããµã€ã¯ã«ã«çµã³ã€ãããªãœãŒã¹ã管çããã®ã«åœ¹ç«ã¡ãŸãã
泚æïŒãããã®ãã¯ããã¯ã¯ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®åäœã«äŸåãããããæ éã«äœ¿çšããŠãã ãããã¬ããŒãžã³ã¬ã¯ã·ã§ã³ã®ã¿ã€ãã³ã°ã¯å¿ ãããäºæž¬å¯èœã§ã¯ãããŸããã
äŸïŒ
const registry = new FinalizationRegistry(heldValue => {
console.log(`ã¯ãªãŒã³ã¢ãã: ${heldValue}`);
// ããã§ã¯ãªãŒã³ã¢ãããå®è¡ããŸãïŒäŸïŒæ¥ç¶ãéããïŒ
});
class MyObject {
constructor(id) {
this.id = id;
registry.register(this, `Object ${id}`, this);
}
}
let obj1 = new MyObject(1);
let obj2 = new MyObject(2);
// ... åŸã§ãobj1ãšobj2ãåç
§ãããªããªã£ãå ŽåïŒ
// obj1 = null;
// obj2 = null;
// ã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæçµçã«FinalizationRegistryãããªã¬ãŒã
// ã¯ãªãŒã³ã¢ããã¡ãã»ãŒãžããã°ã«èšé²ãããŸãã
3. ãšã©ãŒå¢çãšå埩
ãšã©ãŒå¢çãå®è£ ããããšã§ããšã©ãŒãäŒæããŠã¹ããªãŒã å šäœãäžæãããã®ãé²ãããšãã§ããŸãããšã©ãŒå¢çã¯ãšã©ãŒããã£ããããã¹ããªãŒã ãå埩ãŸãã¯æ£åžžã«çµäºãããããã®ã¡ã«ããºã ãæäŸããŸãã
äŸïŒ
async function* processData(dataStream) {
try {
for await (const data of dataStream) {
try {
// åŠçäžã®æœåšçãªãšã©ãŒãã·ãã¥ã¬ãŒã
if (Math.random() < 0.1) {
throw new Error('åŠçãšã©ãŒïŒ');
}
yield `åŠçæžã¿: ${data}`;
} catch (error) {
console.error('ããŒã¿åŠçãšã©ãŒ:', error);
// åé¡ã®ããããŒã¿ãå埩ãŸãã¯ã¹ããã
yield `ãšã©ãŒ: ${error.message}`;
}
}
} catch (error) {
console.error('ã¹ããªãŒã ãšã©ãŒ:', error);
// ã¹ããªãŒã ãšã©ãŒãåŠçããŸãïŒäŸïŒãã°èšé²ãçµäºïŒ
}
}
async function* generateData() {
for (let i = 0; i < 10; i++) {
await new Promise(resolve => setTimeout(resolve, 100));
yield `ããŒã¿ ${i}`;
}
}
async function main() {
for await (const result of processData(generateData())) {
console.log(result);
}
}
main();
å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹
èªååãããã¹ããªãŒã ã¯ãªãŒã³ã¢ãããäžå¯æ¬ ãšãªããããã€ãã®å®äžçã®äŸãšãŠãŒã¹ã±ãŒã¹ãæ¢ã£ãŠã¿ãŸãããã
1. 倧容éãã¡ã€ã«ã®ã¹ããªãŒãã³ã°
倧容éãã¡ã€ã«ãã¹ããªãŒãã³ã°ããå ŽåãåŠçåŸã«ãã¡ã€ã«ãã³ãã«ãé©åã«éããããããšãä¿èšŒããããšãäžå¯æ¬ ã§ããããã«ããããã¡ã€ã«ãã³ãã«ã®æ¯æžãé²ãããã¡ã€ã«ãç¡æéã«éããããŸãŸã«ãªãããšãé²ããŸãã
äŸ (倧容éCSVãã¡ã€ã«ã®èªã¿èŸŒã¿ãšåŠç)ïŒ
const fs = require('node:fs');
const readline = require('node:readline');
async function processLargeCSV(filePath) {
const fileStream = fs.createReadStream(filePath);
const rl = readline.createInterface({
input: fileStream,
crlfDelay: Infinity
});
try {
for await (const line of rl) {
// CSVãã¡ã€ã«ã®åè¡ãåŠç
console.log(`åŠçäž: ${line}`);
}
} finally {
fileStream.close(); // ãã¡ã€ã«ã¹ããªãŒã ã確å®ã«éããããããã«ãã
console.log('ãã¡ã€ã«ã¹ããªãŒã ãéããããŸããã');
}
}
async function main() {
try{
await processLargeCSV('large_data.csv');
} catch (error) {
console.error('CSVåŠçãšã©ãŒ:', error);
}
}
main();
2. ããŒã¿ããŒã¹æ¥ç¶ã®åŠç
ããŒã¿ããŒã¹ãæ±ãéã«ã¯ãäžèŠã«ãªã£ãæ¥ç¶ãè§£æŸããããšãäžå¯æ¬ ã§ããããã«ãããæ¥ç¶ã®æ¯æžãé²ããããŒã¿ããŒã¹ãä»ã®ãªã¯ãšã¹ããåŠçã§ããããã«ããŸãã
äŸ (ããŒã¿ããŒã¹ããããŒã¿ãååŸããæ¥ç¶ãéãã)ïŒ
const { Pool } = require('pg');
async function fetchDataFromDatabase(query) {
const pool = new Pool({
user: 'dbuser',
host: 'localhost',
database: 'mydb',
password: 'dbpassword',
port: 5432
});
let client;
try {
client = await pool.connect();
const result = await client.query(query);
return result.rows;
} finally {
if (client) {
client.release(); // ã³ãã¯ã·ã§ã³ãããŒã«ã«è¿åŽ
console.log('ããŒã¿ããŒã¹æ¥ç¶ãè§£æŸãããŸããã');
}
}
}
async function main() {
try{
const data = await fetchDataFromDatabase('SELECT * FROM mytable');
console.log('ããŒã¿:', data);
} catch (error) {
console.error('ããŒã¿ååŸãšã©ãŒ:', error);
}
}
main();
3. ãããã¯ãŒã¯ã¹ããªãŒã ã®åŠç
ãããã¯ãŒã¯ã¹ããªãŒã ãåŠçããéã«ã¯ãããŒã¿ã®åä¿¡åŸã«ãœã±ãããæ¥ç¶ãéããããšãäžå¯æ¬ ã§ããããã«ããããªãœãŒã¹ãªãŒã¯ãé²ãããµãŒããŒãä»ã®æ¥ç¶ãåŠçã§ããããã«ãªããŸãã
äŸ (ãªã¢ãŒãAPIããããŒã¿ãååŸããæ¥ç¶ãéãã)ïŒ
const https = require('node:https');
async function fetchDataFromAPI(url) {
return new Promise((resolve, reject) => {
const req = https.get(url, (res) => {
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
resolve(JSON.parse(data));
});
});
req.on('error', (error) => {
reject(error);
});
req.on('close', () => {
console.log('æ¥ç¶ãéããããŸããã');
});
});
}
async function main() {
try {
const data = await fetchDataFromAPI('https://jsonplaceholder.typicode.com/todos/1');
console.log('ããŒã¿:', data);
} catch (error) {
console.error('ããŒã¿ååŸãšã©ãŒ:', error);
}
}
main();
çµè«
å¹ççãªãªãœãŒã¹ç®¡çãšèªååãããã¹ããªãŒã ã¯ãªãŒã³ã¢ããã¯ãå
ç¢ã§ã¹ã±ãŒã©ãã«ãªJavaScriptã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã«äžå¯æ¬ ã§ããéåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿ãçè§£ããtry...finally
ãããã¯ãSymbol.asyncDispose
ïŒå©çšå¯èœãªå ŽåïŒããªãœãŒã¹ã©ãããŒããã£ã³ã»ã«ããŒã¯ã³ããšã©ãŒå¢çãªã©ã®ãã¯ããã¯ãçšããããšã§ãéçºè
ã¯ãšã©ãŒããã£ã³ã»ã«ã®éã«ããªãœãŒã¹ãåžžã«è§£æŸãããããšãä¿èšŒã§ããŸãã
çµã¿èŸŒã¿ã®ãªãœãŒã¹ç®¡çæ©èœãæäŸããã©ã€ãã©ãªããã¬ãŒã ã¯ãŒã¯ã掻çšããããšã§ãããã»ã¹ãããã«ç°¡çŽ åãããšã©ãŒã®ãªã¹ã¯ãäœæžã§ããŸãããã¹ããã©ã¯ãã£ã¹ã«åŸãããªãœãŒã¹ç®¡çã«çްå¿ã®æ³šæãæãããšã§ãéçºè ã¯ä¿¡é Œæ§ãé«ããå¹ççã§ãä¿å®å¯èœãªéåæã³ãŒããäœæã§ãã倿§ãªã°ããŒãã«ç°å¢ã«ãããŠã¢ããªã±ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãšå®å®æ§ãåäžãããããšãã§ããŸãã
ãããªãåŠç¿
- MDN Web Docs - éåæã€ãã¬ãŒã¿ãšãžã§ãã¬ãŒã¿: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for-await...of
- Node.js Streams API ããã¥ã¡ã³ã: https://nodejs.org/api/stream.html
- RxJS ããã¥ã¡ã³ã: https://rxjs.dev/
- æç€ºçãªãªãœãŒã¹ç®¡çã®ææ¡: https://github.com/tc39/proposal-explicit-resource-management
ããã«ç€ºãããäŸããã¯ããã¯ããç¹å®ã®ãŠãŒã¹ã±ãŒã¹ãç°å¢ã«åãããŠé©å¿ãããã¢ããªã±ãŒã·ã§ã³ã®é·æçãªå¥å šæ§ãšå®å®æ§ã確ä¿ããããã«ãåžžã«ãªãœãŒã¹ç®¡çãåªå ããããšãå¿ããªãã§ãã ããã