JavaScriptã®æç€ºçãªãœãŒã¹ç®¡çãæ¢æ±ãããªãœãŒã¹ã®èªåã¯ãªãŒã³ã¢ããã§ä¿¡é Œæ§ãšå¹çæ§ã®é«ãã¢ããªã±ãŒã·ã§ã³ãå®çŸããã®æ©èœãå©ç¹ãå®è·µäŸãåŠã³ãŸãã
JavaScriptã®æç€ºçãªãœãŒã¹ç®¡çïŒå ç¢ãªã¢ããªã±ãŒã·ã§ã³ã®ããã®ã¯ãªãŒã³ã¢ããèªåå
JavaScriptã¯èªåçãªã¬ããŒãžã³ã¬ã¯ã·ã§ã³ãæäŸããŠããŸãããæŽå²çã«æ±ºå®è«çãªãªãœãŒã¹ç®¡çã®ããã®çµã¿èŸŒã¿ã¡ã«ããºã ããããŸããã§ããããã®ãããéçºè
ã¯ç¹ã«ãã¡ã€ã«ãã³ãã«ãããŒã¿ããŒã¹æ¥ç¶ããããã¯ãŒã¯ãœã±ããããã®ä»ã®å€éšäŸåé¢ä¿ãå«ãã·ããªãªã§ãªãœãŒã¹ãé©åã«è§£æŸãããããšãä¿èšŒããããã«ãtry...finallyãããã¯ãæåã®ã¯ãªãŒã³ã¢ãã颿°ãšãã£ããã¯ããã¯ã«é Œã£ãŠããŸãããçŸä»£ã®JavaScriptã«å°å
¥ãããæç€ºçãªãœãŒã¹ç®¡çïŒERMïŒã¯ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ãããèªååããããã®åŒ·åãªãœãªã¥ãŒã·ã§ã³ãæäŸããããä¿¡é Œæ§ãé«ãå¹ççãªã¢ããªã±ãŒã·ã§ã³ã®å®çŸã«ã€ãªãããŸãã
æç€ºçãªãœãŒã¹ç®¡çãšã¯ïŒ
æç€ºçãªãœãŒã¹ç®¡çã¯ã決å®è«çãªç Žæ£ãŸãã¯ã¯ãªãŒã³ã¢ãããå¿ èŠãªãªããžã§ã¯ããå®çŸ©ããããã®ããŒã¯ãŒããšã·ã³ãã«ãå°å ¥ããJavaScriptã®æ°æ©èœã§ããåŸæ¥ã®æ¹æ³ãšæ¯èŒããŠããªãœãŒã¹ã管çããããã®æšæºåããããããèªã¿ãããæ¹æ³ãæäŸããŸããäž»èŠãªæ§æèŠçŽ ã¯ä»¥äžã®éãã§ãïŒ
using宣èšïŒusing宣èšã¯ãSymbol.disposeã¡ãœããïŒåæãªãœãŒã¹çšïŒãŸãã¯Symbol.asyncDisposeã¡ãœããïŒéåæãªãœãŒã¹çšïŒãå®è£ ãããªãœãŒã¹ã®ã¬ãã·ã«ã«ãã€ã³ãã£ã³ã°ãäœæããŸããusingãããã¯ãæãããšãdisposeã¡ãœãããèªåçã«åŒã³åºãããŸããawait using宣èšïŒ ããã¯usingã®éåæçã§ãããéåæã®ç Žæ£ãå¿ èŠãšãããªãœãŒã¹ã«äœ¿çšãããŸããSymbol.asyncDisposeã䜿çšããŸããSymbol.disposeïŒ ãªãœãŒã¹ãåæçã«è§£æŸããã¡ãœãããå®çŸ©ãããŠã§ã«ããŠã³ã·ã³ãã«ã§ãããã®ã¡ãœããã¯usingãããã¯ãæãããšãã«èªåçã«åŒã³åºãããŸããSymbol.asyncDisposeïŒ ãªãœãŒã¹ãéåæçã«è§£æŸããã¡ãœãããå®çŸ©ãããŠã§ã«ããŠã³ã·ã³ãã«ã§ãããã®ã¡ãœããã¯await usingãããã¯ãæãããšãã«èªåçã«åŒã³åºãããŸãã
æç€ºçãªãœãŒã¹ç®¡çã®å©ç¹
ERMã¯ãåŸæ¥ã®ãªãœãŒã¹ç®¡çæè¡ã«æ¯ã¹ãŠããã€ãã®å©ç¹ãæäŸããŸãïŒ
- 決å®è«çãªã¯ãªãŒã³ã¢ããïŒ ãªãœãŒã¹ãäºæž¬å¯èœãªã¿ã€ãã³ã°ïŒéåžžã¯
usingãããã¯ãæãããšãïŒã«è§£æŸãããããšãä¿èšŒããŸããããã«ããããªãœãŒã¹ãªãŒã¯ãé²ããã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãåäžãããŸãã - å¯èªæ§ã®åäžïŒ
usingããã³await usingããŒã¯ãŒãã¯ããªãœãŒã¹ç®¡çããžãã¯ãæç¢ºãã€ç°¡æœã«è¡šçŸããæ¹æ³ãæäŸããã³ãŒãã®çè§£ãšä¿å®ã容æã«ããŸãã - å®åã³ãŒãã®åæžïŒ ERMã¯ãå埩çãª
try...finallyãããã¯ã®å¿ èŠæ§ããªãããã³ãŒããç°¡çŽ åãããšã©ãŒã®ãªã¹ã¯ãäœæžããŸãã - ãšã©ãŒãã³ããªã³ã°ã®åŒ·åïŒ ERMã¯JavaScriptã®ãšã©ãŒãã³ããªã³ã°ã¡ã«ããºã ãšã·ãŒã ã¬ã¹ã«çµ±åãããŸãããªãœãŒã¹ã®ç Žæ£äžã«ãšã©ãŒãçºçããå ŽåããããææããŠé©åã«åŠçã§ããŸãã
- åæããã³éåæãªãœãŒã¹ã®ãµããŒãïŒ ERMã¯åæããã³éåæã®äž¡æ¹ã®ãªãœãŒã¹ã管çããã¡ã«ããºã ãæäŸãããããå¹ åºãã¢ããªã±ãŒã·ã§ã³ã«é©ããŠããŸãã
æç€ºçãªãœãŒã¹ç®¡çã®å®è·µäŸ
äŸ1ïŒåæãªãœãŒã¹ç®¡çïŒãã¡ã€ã«ãã³ããªã³ã°ïŒ
ãã¡ã€ã«ããããŒã¿ãèªã¿åãå¿
èŠãããã·ããªãªãèããŠã¿ãŸããããERMããªãå Žåããšã©ãŒãçºçããå Žåã§ããã¡ã€ã«ã確å®ã«éããããããã«ãtry...finallyãããã¯ã䜿çšãããããããŸããïŒ
let fileHandle;
try {
fileHandle = fs.openSync('my_file.txt', 'r');
// Read data from the file
const data = fs.readFileSync(fileHandle);
console.log(data.toString());
} catch (error) {
console.error('Error reading file:', error);
} finally {
if (fileHandle) {
fs.closeSync(fileHandle);
console.log('File closed.');
}
}
ERMã䜿çšãããšãããã¯ã¯ããã«ã¯ãªãŒã³ã«ãªããŸãïŒ
const fs = require('node:fs');
class FileHandle {
constructor(filename, mode) {
this.filename = filename;
this.mode = mode;
this.handle = fs.openSync(filename, mode);
}
[Symbol.dispose]() {
fs.closeSync(this.handle);
console.log('File closed using Symbol.dispose.');
}
readSync() {
return fs.readFileSync(this.handle);
}
}
try {
using file = new FileHandle('my_file.txt', 'r');
const data = file.readSync();
console.log(data.toString());
} catch (error) {
console.error('Error reading file:', error);
}
// File is automatically closed when the 'using' block exits
ãã®äŸã§ã¯ãFileHandleã¯ã©ã¹ããã¡ã€ã«ãéããSymbol.disposeã¡ãœãããå®è£
ããŠããŸããusing宣èšã«ããããšã©ãŒãçºçãããã©ããã«é¢ãããããããã¯ãæãããšãã«ãã¡ã€ã«ãèªåçã«éããããããšãä¿èšŒãããŸãã
äŸ2ïŒéåæãªãœãŒã¹ç®¡çïŒããŒã¿ããŒã¹æ¥ç¶ïŒ
ããŒã¿ããŒã¹æ¥ç¶ãéåæã§ç®¡çããããšã¯äžè¬çãªã¿ã¹ã¯ã§ããERMããªãå Žåãããã«ã¯è€éãªãšã©ãŒåŠçãšæåã§ã®ã¯ãªãŒã³ã¢ããããã°ãã°äŒŽããŸãïŒ
async function processData() {
let connection;
try {
connection = await db.connect();
// Perform database operations
const result = await connection.query('SELECT * FROM users');
console.log(result);
} catch (error) {
console.error('Error processing data:', error);
} finally {
if (connection) {
await connection.close();
console.log('Database connection closed.');
}
}
}
ERMã䜿çšãããšãéåæã®ã¯ãªãŒã³ã¢ãããã¯ããã«ãšã¬ã¬ã³ãã«ãªããŸãïŒ
class DatabaseConnection {
constructor(config) {
this.config = config;
this.connection = null;
}
async connect() {
this.connection = await db.connect(this.config);
return this.connection;
}
async query(sql) {
if (!this.connection) {
throw new Error("Not connected");
}
return this.connection.query(sql);
}
async [Symbol.asyncDispose]() {
if (this.connection) {
await this.connection.close();
console.log('Database connection closed using Symbol.asyncDispose.');
}
}
}
async function processData() {
const dbConfig = { /* ... */ };
try {
await using connection = new DatabaseConnection(dbConfig);
await connection.connect();
// Perform database operations
const result = await connection.query('SELECT * FROM users');
console.log(result);
} catch (error) {
console.error('Error processing data:', error);
}
// Database connection is automatically closed when the 'await using' block exits
}
processData();
ããã§ã¯ãDatabaseConnectionã¯ã©ã¹ãæ¥ç¶ãéåæã§éããããã®Symbol.asyncDisposeã¡ãœãããå®è£
ããŠããŸããawait using宣èšã«ãããããŒã¿ããŒã¹æäœäžã«ãšã©ãŒãçºçããå Žåã§ãæ¥ç¶ã確å®ã«éããããŸãã
äŸ3ïŒãããã¯ãŒã¯ãœã±ããã®ç®¡ç
ãããã¯ãŒã¯ãœã±ããããæ±ºå®è«çãªã¯ãªãŒã³ã¢ããããæ©æµãåãããªãœãŒã¹ã§ããç°¡ç¥åãããäŸãèããŠã¿ãŸãããïŒ
const net = require('node:net');
class SocketWrapper {
constructor(port, host) {
this.port = port;
this.host = host;
this.socket = new net.Socket();
}
connect() {
return new Promise((resolve, reject) => {
this.socket.connect(this.port, this.host, () => {
console.log('Connected to server.');
resolve();
});
this.socket.on('error', (err) => {
reject(err);
});
});
}
write(data) {
this.socket.write(data);
}
[Symbol.asyncDispose]() {
return new Promise((resolve) => {
this.socket.destroy();
console.log('Socket destroyed using Symbol.asyncDispose.');
resolve();
});
}
}
async function communicateWithServer() {
try {
await using socket = new SocketWrapper(1337, '127.0.0.1');
await socket.connect();
socket.write('Hello from client!\n');
// Simulate some processing
await new Promise(resolve => setTimeout(resolve, 1000));
} catch (error) {
console.error('Error communicating with server:', error);
}
// Socket is automatically destroyed when the 'await using' block exits
}
communicateWithServer();
SocketWrapperã¯ã©ã¹ã¯ãœã±ãããã«ãã»ã«åãããããç Žæ£ããããã®asyncDisposeã¡ãœãããæäŸããŸããawait using宣èšã«ãããã¿ã€ã ãªãŒãªã¯ãªãŒã³ã¢ãããä¿èšŒãããŸãã
æç€ºçãªãœãŒã¹ç®¡çã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
- ãªãœãŒã¹éçŽåã®ãªããžã§ã¯ããç¹å®ããïŒ ãã¡ã€ã«ãã³ãã«ãããŒã¿ããŒã¹æ¥ç¶ããããã¯ãŒã¯ãœã±ãããã¡ã¢ãªãããã¡ãªã©ãéèŠãªãªãœãŒã¹ãæ¶è²»ãããªããžã§ã¯ãã«çŠç¹ãåœãŠãŸãã
Symbol.disposeãŸãã¯Symbol.asyncDisposeãå®è£ ããïŒusingãããã¯ãæãããšãã«ãªãœãŒã¹ãè§£æŸãããããã«ããªãœãŒã¹ã¯ã©ã¹ãé©åãªç Žæ£ã¡ãœãããå®è£ ããŠããããšã確èªããŸããusingãšawait usingãé©åã«äœ¿çšããïŒ ãªãœãŒã¹ã®ç Žæ£ãåæçãéåæçãã«åºã¥ããŠãæ£ãã宣èšãéžæããŸãã- ç Žæ£ãšã©ãŒãåŠçããïŒ ãªãœãŒã¹ã®ç Žæ£äžã«çºçããå¯èœæ§ã®ãããšã©ãŒã«å¯ŸåŠããæºåãããŸãã
usingãããã¯ãtry...catchãããã¯ã§å²ã¿ãäŸå€ãææããŠãã°ã«èšé²ããããåã¹ããŒããŸãã - 埪ç°äŸåãé¿ããïŒ ãªãœãŒã¹éã®åŸªç°äŸåã¯ç Žæ£ã®åé¡ã«ã€ãªããå¯èœæ§ããããããæ³šæãå¿ èŠã§ãããããã®ãµã€ã¯ã«ãæã¡åããªãœãŒã¹ç®¡çæŠç¥ã®äœ¿çšãæ€èšããŸãã
- ãªãœãŒã¹ããŒãªã³ã°ãæ€èšããïŒ ããŒã¿ããŒã¹æ¥ç¶ã®ããã«é »ç¹ã«äœ¿çšããããªãœãŒã¹ã«ã€ããŠã¯ãããã©ãŒãã³ã¹ãæé©åããããã«ERMãšçµã¿åãããŠãªãœãŒã¹ããŒãªã³ã°æè¡ã䜿çšããããšãæ€èšããŸãã
- ãªãœãŒã¹ç®¡çãææžåããïŒ äœ¿çšãããç Žæ£ã¡ã«ããºã ãå«ããã³ãŒãå ã§ãªãœãŒã¹ãã©ã®ããã«ç®¡çãããŠããããæç¢ºã«ææžåããŸããããã¯ãä»ã®éçºè ãã³ãŒããçè§£ããä¿å®ããã®ã«åœ¹ç«ã¡ãŸãã
äºææ§ãšããªãã£ã«
æ¯èŒçæ°ããæ©èœã§ãããããæç€ºçãªãœãŒã¹ç®¡çã¯ãã¹ãŠã®JavaScriptç°å¢ã§ãµããŒããããŠããããã§ã¯ãããŸãããå€ãç°å¢ãšã®äºææ§ã確ä¿ããããã«ãããªãã£ã«ã®äœ¿çšãæ€èšããŠãã ãããBabelã®ãããªãã©ã³ã¹ãã€ã©ããusing宣èšãtry...finallyãããã¯ã䜿çšããåçã®ã³ãŒãã«å€æããããã«èšå®ã§ããŸãã
ã°ããŒãã«ãªèæ ®äºé
ERMã¯æè¡çãªæ©èœã§ããããã®å©ç¹ã¯ããŸããŸãªã°ããŒãã«ãªæèã«åã³ãŸãïŒ
- 忣ã·ã¹ãã ã«ãããä¿¡é Œæ§ã®åäžïŒ ã°ããŒãã«ã«åæ£ããã·ã¹ãã ã§ã¯ãä¿¡é Œæ§ã®é«ããªãœãŒã¹ç®¡çãäžå¯æ¬ ã§ããERMã¯ããµãŒãã¹ã®åæ¢ã«ã€ãªããå¯èœæ§ã®ãããªãœãŒã¹ãªãŒã¯ãé²ãã®ã«åœ¹ç«ã¡ãŸãã
- ãªãœãŒã¹å¶çŽã®ããç°å¢ã§ã®ããã©ãŒãã³ã¹åäžïŒ éããããªãœãŒã¹ã®ç°å¢ïŒäŸïŒã¢ãã€ã«ããã€ã¹ãIoTããã€ã¹ïŒã§ã¯ãERMã¯ãªãœãŒã¹ãè¿ éã«è§£æŸããããšã§ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžãããããšãã§ããŸãã
- éçšã³ã¹ãã®åæžïŒ ãªãœãŒã¹ãªãŒã¯ãé²ããã¢ããªã±ãŒã·ã§ã³ã®å®å®æ§ãåäžãããããšã«ãããERMã¯ãªãœãŒã¹é¢é£ã®åé¡ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãšä¿®æ£ã«é¢é£ããéçšã³ã¹ããåæžããã®ã«åœ¹ç«ã¡ãŸãã
- ããŒã¿ä¿è·èŠå¶ãžã®æºæ ïŒ é©åãªãªãœãŒã¹ç®¡çã¯ãæ©å¯ããŒã¿ã誀ã£ãŠæŒæŽ©ããã®ãé²ãããšã«ãããGDPRãªã©ã®ããŒã¿ä¿è·èŠå¶ãžã®æºæ ã確ä¿ããã®ã«åœ¹ç«ã¡ãŸãã
çµè«
JavaScriptã®æç€ºçãªãœãŒã¹ç®¡çã¯ããªãœãŒã¹ã®ã¯ãªãŒã³ã¢ãããèªååããããã®åŒ·åã§ãšã¬ã¬ã³ããªãœãªã¥ãŒã·ã§ã³ãæäŸããŸããusingããã³await using宣èšã䜿çšããããšã§ãéçºè
ã¯ãªãœãŒã¹ãè¿
éãã€ç¢ºå®ã«è§£æŸãããããšãä¿èšŒã§ããããå
ç¢ã§å¹ççããã€ä¿å®ããããã¢ããªã±ãŒã·ã§ã³ã«ã€ãªãããŸããERMãããåºãæ¡çšãããã«ã€ããŠãããã¯äžçäžã®JavaScriptéçºè
ã«ãšã£ãŠäžå¯æ¬ ãªããŒã«ã«ãªãã§ãããã
ãããªãåŠç¿ã®ããã«
- ECMAScriptããããŒã¶ã«ïŒ æè¡çãªè©³çްãšèšèšäžã®èæ ®äºé ãçè§£ããããã«ãæç€ºçãªãœãŒã¹ç®¡çã®å ¬åŒããããŒã¶ã«ãèªãã§ãã ããã
- MDN Web DocsïŒ
using宣èšãSymbol.disposeãããã³Symbol.asyncDisposeã«é¢ããå æ¬çãªããã¥ã¡ã³ãã«ã€ããŠã¯ãMDN Web Docsãåç §ããŠãã ããã - ãªã³ã©ã€ã³ãã¥ãŒããªã¢ã«ãšèšäºïŒ ããŸããŸãªã·ããªãªã§ERMã䜿çšããããã®å®è·µçãªäŸãšã¬ã€ãã³ã¹ãæäŸãããªã³ã©ã€ã³ãã¥ãŒããªã¢ã«ãèšäºãæ¢æ±ããŠãã ããã