کلمه کلیدی using در نسخه ۵٫۲ تایپ اسکریپت

تایپ اسکریپت در نسخه ۵٫۲ یک کلمه کلیدی جدید به نام using را معرفی می‌کند که می‌توانیم از آن برای dispose هر چیزی با تابع Symbol.dispose هنگامی که از scope خارج می‌شود، استفاده کنیم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
{
const getResource = () => {
return {
[Symbol.dispose]: () => {
console.log('Hooray!')
}
}
}
using resource = getResource();
} // 'Hooray!' logged to console
{ const getResource = () => { return { [Symbol.dispose]: () => { console.log('Hooray!') } } } using resource = getResource(); } // 'Hooray!' logged to console
{
  const getResource = () => {
    return {
      [Symbol.dispose]: () => {
        console.log('Hooray!')
      }
    }
  }
  using resource = getResource();
} // 'Hooray!' logged to console

این مفهوم بر اساس پیشنهاد TC39 است، که اخیراً در پیشرفت خود به جاوااسکریپت به مرحله ۳ (از ۴) رسیده است.

استفاده از using برای مدیریت منابعی مانند file handleها، اتصالات پایگاه داده و موارد دیگر بسیار مفید خواهد بود.

Symbol.dispose

Symbol.dispose
Symbol.disposeیک نماد سراسری جدید در جاوااسکریپت است. هر چیزی که با یک تابع به
Symbol.dispose
Symbol.disposeاختصاص داده شود یک resource، یعنی آبجکتی با طول عمر مشخص در نظر گرفته می‌شود و می‌تواند با کلمه کلیدی using مورد استفاده قرار بگیرد.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const resource = {
[Symbol.dispose]: () => {
console.log("Hooray!");
},
};
const resource = { [Symbol.dispose]: () => { console.log("Hooray!"); }, };
const resource = {
  [Symbol.dispose]: () => {
    console.log("Hooray!");
  },
};

await using

همچنین می‌توانیم از

Symbol.asyncDispose
Symbol.asyncDisposeو await using برای مدیریت منابعی که باید به‌صورت غیرهمزمان (Asynchronous) dispose شوند در تایپ اسکریپت استفاده کنیم.

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const getResource = () => ({
[Symbol.asyncDispose]: async () => {
await someAsyncFunc();
},
});
{
await using resource = getResource();
}
const getResource = () => ({ [Symbol.asyncDispose]: async () => { await someAsyncFunc(); }, }); { await using resource = getResource(); }
const getResource = () => ({
  [Symbol.asyncDispose]: async () => {
    await someAsyncFunc();
  },
});
{
  await using resource = getResource();
}

در مثال بالا قبل از این که کدها اجرا شوند، منتظر تابع

Symbol.asyncDispose
Symbol.asyncDispose خواهند بود.

این مفهوم برای منابعی مانند اتصالات پایگاه داده مفید خواهد بود، زیرا این قسمت همان جایی است که می‌خواهیم اطمینان حاصل کنیم که اتصال قبل از ادامه برنامه بسته شده است.

موارد استفاده از کلمه کلیدی using

File handleها

استفاده از using می‌تواند دسترسی به فایل سیستم(fs) از طریق handlerهای فایل در node را بسیار آسان‌تر کند.

بدون استفاده از کلمه کلیدی using:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import { open } from "node:fs/promises";
let filehandle;
try {
filehandle = await open("thefile.txt", "r");
} finally {
await filehandle?.close();
}
import { open } from "node:fs/promises"; let filehandle; try { filehandle = await open("thefile.txt", "r"); } finally { await filehandle?.close(); }
import { open } from "node:fs/promises";
let filehandle;
try {
  filehandle = await open("thefile.txt", "r");
} finally {
  await filehandle?.close();
}

با استفاده از کلمه کلیدی using:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
import { open } from "node:fs/promises";
const getFileHandle = async (path: string) => {
const filehandle = await open(path, "r");
return {
filehandle,
[Symbol.asyncDispose]: async () => {
await filehandle.close();
},
};
};
{
await using file = getFileHandle("thefile.txt");
// Do stuff with file.filehandle
} // Automatically disposed!
import { open } from "node:fs/promises"; const getFileHandle = async (path: string) => { const filehandle = await open(path, "r"); return { filehandle, [Symbol.asyncDispose]: async () => { await filehandle.close(); }, }; }; { await using file = getFileHandle("thefile.txt"); // Do stuff with file.filehandle } // Automatically disposed!
import { open } from "node:fs/promises";
const getFileHandle = async (path: string) => {
  const filehandle = await open(path, "r");
  return {
    filehandle,
    [Symbol.asyncDispose]: async () => {
      await filehandle.close();
    },
  };
};
{
  await using file = getFileHandle("thefile.txt");
  // Do stuff with file.filehandle
} // Automatically disposed!

اتصالات پایگاه داده

مدیریت اتصالات پایگاه داده یکی از موارد رایج برای استفاده از using در سی‌شارپ است.

بدون استفاده از کلمه کلیدی using:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const connection = await getDb();
try {
// Do stuff with connection
} finally {
await connection.close();
}
const connection = await getDb(); try { // Do stuff with connection } finally { await connection.close(); }
const connection = await getDb();
try {
  // Do stuff with connection
} finally {
  await connection.close();
}

با استفاده از کلمه کلیدی using:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
const getConnection = async () => {
const connection = await getDb();
return {
connection,
[Symbol.asyncDispose]: async () => {
await connection.close();
},
};
};
{
await using db = getConnection();
// Do stuff with db.connection
} // Automatically closed!
const getConnection = async () => { const connection = await getDb(); return { connection, [Symbol.asyncDispose]: async () => { await connection.close(); }, }; }; { await using db = getConnection(); // Do stuff with db.connection } // Automatically closed!
const getConnection = async () => {
  const connection = await getDb();
  return {
    connection,
    [Symbol.asyncDispose]: async () => {
      await connection.close();
    },
  };
};
{
  await using db = getConnection();
  // Do stuff with db.connection
} // Automatically closed!

جمع‌بندی

در این مقاله سعی کردیم تا کلمه کلیدی using که در نسخه ۵٫۲ تایپ اسکریپت معرفی شده است را باهم بررسی کنیم و با کاربردهای آن آشنا شویم.

دیدگاه‌ها:

افزودن دیدگاه جدید