JavaScript'da resurslarni boshqarishning ilg'or usullarini chuqur o'rganish. Toza, xavfsiz va yuqori unumdorlikdagi ilovalar uchun 'using' e'lonini resurslar puli bilan birlashtirishni o'rganing.
Resurslarni boshqarishni mukammallashtirish: JavaScript 'using' operatori va resurslar puli strategiyasi
Yuqori unumdorlikdagi server tomonidagi JavaScript dunyosida, ayniqsa Node.js va Deno kabi muhitlarda resurslarni samarali boshqarish shunchaki eng yaxshi amaliyot emas; bu kengaytiriladigan, barqaror va tejamkor ilovalarni yaratishning muhim tarkibiy qismidir. Dasturchilar ko'pincha ma'lumotlar bazasi ulanishlari, fayl dastaklari, tarmoq soketlari yoki ishchi oqimlar kabi cheklangan, yaratilishi qimmat bo'lgan resurslarni boshqarish bilan kurashadilar. Bu resurslarni noto'g'ri ishlatish xotira sizib chiqishi, ulanishlarning tugashi, tizim beqarorligi va unumdorlikning pasayishi kabi muammolar kaskadiga olib kelishi mumkin.
An'anaga ko'ra, dasturchilar resurslarning tozalanishini ta'minlash uchun try...catch...finally
blokiga tayanishgan. Samarali bo'lishiga qaramay, bu shablon ko'p so'zli va xatoliklarga moyil bo'lishi mumkin. Boshqa tomondan, unumdorlik uchun biz bu aktivlarni doimiy ravishda yaratish va yo'q qilish xarajatlarini oldini olish uchun resurslar pulidan foydalanamiz. Ammo biz kafolatlangan tozalash xavfsizligini resurslarni qayta ishlatish samaradorligi bilan qanday qilib oqilona birlashtirishimiz mumkin? Javob ikki tushunchaning kuchli sinergiyasida yotadi: boshqa tillarda topilgan using
operatorini eslatuvchi shablon va resurslar pulining isbotlangan strategiyasi.
Ushbu keng qamrovli qo'llanma zamonaviy JavaScript'da mustahkam resurslarni boshqarish strategiyasini qanday qurishni o'rganadi. Biz resurslarni aniq boshqarish bo'yicha bo'lajak TC39 taklifini chuqur o'rganamiz, u using
va await using
kalit so'zlarini taqdim etadi va ham kuchli, ham parvarishlash oson bo'lgan ilovalarni yaratish uchun ushbu toza, deklarativ sintaksisni maxsus resurslar puli bilan qanday integratsiya qilishni namoyish etamiz.
Asosiy muammoni tushunish: JavaScript'da resurslarni boshqarish
Yechim yaratishdan oldin, muammoning nozik tomonlarini tushunish juda muhim. Bu kontekstda 'resurslar' aynan nima va ularni boshqarish nega oddiy xotirani boshqarishdan farq qiladi?
'Resurslar' nima?
Ushbu muhokamada 'resurs' tashqi tizimga ulanishni ushlab turadigan yoki aniq 'yopish' yoki 'uzish' amalini talab qiladigan har qanday ob'ektni anglatadi. Ular ko'pincha soni cheklangan va yaratilishi hisoblash jihatidan qimmatga tushadi. Keng tarqalgan misollar quyidagilarni o'z ichiga oladi:
- Ma'lumotlar bazasi ulanishlari: Ma'lumotlar bazasiga ulanishni o'rnatish tarmoq orqali kelishuv, autentifikatsiya va sessiya sozlashni o'z ichiga oladi, bularning barchasi vaqt va protsessor sikllarini sarflaydi.
- Fayl dastaklari: Operatsion tizimlar bir jarayon bir vaqtning o'zida ochiq tutishi mumkin bo'lgan fayllar sonini cheklaydi. Sizib chiqqan fayl dastaklari ilovaning yangi fayllarni ochishiga to'sqinlik qilishi mumkin.
- Tarmoq soketlari: Tashqi API'lar, xabar navbatlari yoki boshqa mikroservislarga ulanishlar.
- Ishchi oqimlar yoki bola jarayonlar: Jarayon yaratish xarajatlarini oldini olish uchun pulda boshqarilishi kerak bo'lgan og'ir hisoblash resurslari.
Nima uchun axlat yig'uvchi (Garbage Collector) yetarli emas
Tizim dasturlashiga yangi kelgan dasturchilar orasida keng tarqalgan noto'g'ri tushuncha shuki, JavaScript'ning axlat yig'uvchisi (GC) hamma narsani hal qiladi. GC endi murojaat qilinmaydigan ob'ektlar egallagan xotirani qaytarib olishda a'lo darajada ishlaydi. Biroq, u tashqi resurslarni deterministik tarzda boshqarmaydi.
Ma'lumotlar bazasi ulanishini ifodalovchi ob'ektga endi murojaat qilinmasa, GC oxir-oqibat uning xotirasini bo'shatadi. Ammo bu qachon sodir bo'lishi haqida hech qanday kafolat bermaydi va u asosiy tarmoq soketini operatsion tizimga yoki ulanish slotini ma'lumotlar bazasi serveriga qaytarish uchun .close()
usulini chaqirishi kerakligini bilmaydi. Resurslarni tozalash uchun GC ga tayanish deterministik bo'lmagan xatti-harakatlarga va resurslarning sizib chiqishiga olib keladi, bunda sizning ilovangiz qimmatli ulanishlarni keragidan ancha uzoqroq ushlab turadi.
'using' operatorini emulyatsiya qilish: deterministik tozalashga yo'l
C# (using
bilan) va Python (with
bilan) kabi tillar resursning tozalash mantig'i u ko'rinish doirasidan chiqishi bilan bajarilishini kafolatlaydigan oqilona sintaksisni taqdim etadi. Bu tushuncha deterministik resurslarni boshqarish deb ataladi. JavaScript tabiiy yechimga ega bo'lish arafasida, lekin avval an'anaviy usulni ko'rib chiqaylik.
Klassik yondashuv: try...finally
bloki
JavaScript'da resurslarni boshqarishning asosiy vositasi har doim try...finally
bloki bo'lgan. finally
blokidagi kod try
blokidagi kod muvaffaqiyatli yakunlanishidan, xato yuzaga kelishidan yoki qiymat qaytarishidan qat'i nazar, bajarilishi kafolatlanadi.
Ma'lumotlar bazasi ulanishini boshqarish uchun odatiy misol:
asynk funksiya getUserById(id) {
let ulanish;
try {
ulanish = await getDatabaseConnection(); // Resursni olish
const natija = await ulanish.query('SELECT * FROM users WHERE id = ?', [id]);
return natija[0];
} catch (xato) {
console.error("So'rov paytida xatolik yuz berdi:", xato);
throw xato; // Xatoni qayta yuborish
} finally {
if (ulanish) {
await ulanish.close(); // HAR DOIM resursni bo'shatish
}
}
}
Bu shablon ishlaydi, lekin uning kamchiliklari bor:
- Ko'p so'zlilik: Resursni olish va bo'shatish uchun shablon kod ko'pincha asosiy biznes mantig'idan kattaroq bo'ladi.
- Xatolikka moyillik:
if (ulanish)
tekshiruvini unutish yokifinally
blokining o'zida xatolarni noto'g'ri qayta ishlash oson. - Ichma-ich joylashish murakkabligi: Bir nechta resurslarni boshqarish chuqur ichma-ich joylashgan
try...finally
bloklariga olib keladi, bu ko'pincha "halokat piramidasi" deb ataladi.
Zamonaviy yechim: TC39 'using' e'lon qilish taklifi
Bu kamchiliklarni bartaraf etish uchun TC39 qo'mitasi (JavaScript'ni standartlashtiradi) Resurslarni aniq boshqarish taklifini ilgari surdi. Hozirda 3-bosqichda bo'lgan (ya'ni ECMAScript standartiga kiritish uchun nomzod bo'lgan) ushbu taklif ikkita yangi kalit so'zni āusing
va await using
ā va ob'ektlarga o'z tozalash mantig'ini belgilash mexanizmini taqdim etadi.
Ushbu taklifning yadrosi "yo'q qilinadigan" (disposable) resurs tushunchasidir. Ob'ekt ma'lum bir taniqli Symbol kaliti ostida maxsus usulni amalga oshirish orqali yo'q qilinadigan bo'ladi:
[Symbol.dispose]()
: Sinxron tozalash mantig'i uchun.[Symbol.asyncDispose]()
: Asinxron tozalash mantig'i uchun (masalan, tarmoq ulanishini yopish).
O'zgaruvchini using
yoki await using
bilan e'lon qilganingizda, JavaScript o'zgaruvchi ko'rinish doirasidan chiqqanda, ya'ni blok oxirida yoki xato yuzaga kelganda, tegishli dispose usulini avtomatik ravishda chaqiradi.
Keling, yo'q qilinadigan ma'lumotlar bazasi ulanishi o'ramini (wrapper) yarataylik:
class ManagedDatabaseConnection {
constructor(ulanish) {
this.ulanish = ulanish;
this.isDisposed = false;
}
// So'rov kabi ma'lumotlar bazasi usullarini ochib berish
async query(sql, params) {
if (this.isDisposed) {
throw new Error("Ulanish allaqachon yo'q qilingan.");
}
return this.ulanish.query(sql, params);
}
async [Symbol.asyncDispose]() {
if (!this.isDisposed) {
console.log('Ulanish yo\'q qilinmoqda...');
await this.ulanish.close();
this.isDisposed = true;
console.log('Ulanish yo\'q qilindi.');
}
}
}
// Undan qanday foydalanish kerak:
async function getUserByIdWithUsing(id) {
// getRawConnection ulanish ob'ekti uchun promise qaytaradi deb faraz qilamiz
const rawConnection = await getRawConnection();
await using ulanish = new ManagedDatabaseConnection(rawConnection);
const natija = await ulanish.query('SELECT * FROM users WHERE id = ?', [id]);
return natija[0];
// finally bloki kerak emas! `ulanish[Symbol.asyncDispose]` bu yerda avtomatik ravishda chaqiriladi.
}
Farqqa e'tibor bering! Kodning maqsadi juda aniq. Biznes mantig'i oldinda va markazda, resurslarni boshqarish esa avtomatik va ishonchli tarzda parda ortida amalga oshiriladi. Bu kodning aniqligi va xavfsizligi bo'yicha monumental yaxshilanishdir.
Puldan foydalanish qudrati: qayta ishlatish mumkin bo'lganda nima uchun qayta yaratish kerak?
using
shabloni *kafolatlangan tozalash* muammosini hal qiladi. Ammo yuqori trafikli ilovada har bir so'rov uchun ma'lumotlar bazasi ulanishini yaratish va yo'q qilish juda samarasizdir. Aynan shu yerda resurslar pulidan foydalanish o'z o'rnini topadi.
Resurslar puli nima?
Resurslar puli ā bu foydalanishga tayyor resurslar keshini saqlaydigan dizayn shablonidir. Buni kutubxonaning kitoblar to'plami kabi tasavvur qiling. Har safar kitob o'qishni xohlaganingizda yangisini sotib olib, keyin uni tashlab yuborish o'rniga, siz kutubxonadan birini olasiz, o'qiysiz va boshqa birov foydalanishi uchun qaytarasiz. Bu ancha samaraliroq.
Odatdagi resurslar pulini amalga oshirish quyidagilarni o'z ichiga oladi:
- Initsializatsiya: Pul minimal va maksimal resurslar soni bilan yaratiladi. U o'zini minimal miqdordagi resurslar bilan oldindan to'ldirishi mumkin.
- Olish: Mijoz puldan resurs so'raydi. Agar resurs mavjud bo'lsa, pul uni beradi. Agar yo'q bo'lsa, mijoz biri bo'shaguncha kutishi mumkin yoki agar pul maksimal chegarasidan past bo'lsa, yangisini yaratishi mumkin.
- Bo'shatish: Mijoz ishini tugatgandan so'ng, u resursni yo'q qilish o'rniga pulga qaytaradi. Keyin pul o'sha resursni boshqa mijozga berishi mumkin.
- Yo'q qilish: Ilova yopilayotganda, pul o'zi boshqaradigan barcha resurslarni chiroyli tarzda yopadi.
Puldan foydalanishning afzalliklari
- Kechikishni kamaytirish: Puldan resurs olish uni noldan yaratishdan ancha tezroq.
- Kamroq qo'shimcha xarajatlar: Ham ilova serveringizda, ham tashqi tizimda (masalan, ma'lumotlar bazasida) protsessor va xotiraga bo'lgan bosimni kamaytiradi.
- Ulanishlarni cheklash: Maksimal pul hajmini o'rnatish orqali siz ilovangizning ma'lumotlar bazasi yoki tashqi xizmatni juda ko'p bir vaqtda ulanishlar bilan to'ldirib yuborishining oldini olasiz.
Buyuk sintez: `using` ni resurslar puli bilan birlashtirish
Endi biz strategiyamizning asosiy qismiga keldik. Bizda kafolatlangan tozalash uchun ajoyib shablon (using
) va unumdorlik uchun isbotlangan strategiya (puldan foydalanish) mavjud. Ularni qanday qilib uzluksiz, mustahkam yechimga birlashtiramiz?
Maqsad ā puldan resurs olish va biz ishni tugatganimizda, hatto xatolar yuz berganda ham, uning pulga qaytarilishini kafolatlash. Bunga biz dispose protokolini amalga oshiradigan, lekin `dispose` usuli `resource.close()` o'rniga `pool.release()` ni chaqiradigan o'ram (wrapper) ob'ektini yaratish orqali erishishimiz mumkin.
Bu sehrli bog'lanish: `dispose` amali 'yo'q qilish' o'rniga 'pulga qaytarish' bo'ladi.
Bosqichma-bosqich amalga oshirish
Keling, umumiy resurslar pulini va buni amalga oshirish uchun zarur bo'lgan o'ramlarni yarataylik.
1-qadam: Oddiy, umumiy resurslar pulini yaratish
Bu asinxron resurslar pulining konseptual amalga oshirilishi. Ishlab chiqarishga tayyor versiyada taymautlar, bo'sh turgan resurslarni chiqarib yuborish va qayta urinish mantig'i kabi ko'proq xususiyatlar bo'lardi, ammo bu asosiy mexanizmlarni ko'rsatadi.
class ResourcePool {
constructor({ create, destroy, min, max }) {
this.factory = { create, destroy };
this.config = { min, max };
this.pool = []; // Mavjud resurslarni saqlaydi
this.active = []; // Hozirda foydalanilayotgan resurslarni saqlaydi
this.waitQueue = []; // Resurs kutayotgan mijozlar uchun promislarni saqlaydi
// Minimal resurslarni initsializatsiya qilish
for (let i = 0; i < this.config.min; i++) {
this._createResource().then(resource => this.pool.push(resource));
}
}
async _createResource() {
const resource = await this.factory.create();
return resource;
}
async acquire() {
// Agar pulda resurs mavjud bo'lsa, undan foydalaning
if (this.pool.length > 0) {
const resource = this.pool.pop();
this.active.push(resource);
return resource;
}
// Agar biz maksimal chegaradan past bo'lsak, yangisini yarating
if (this.active.length < this.config.max) {
const resource = await this._createResource();
this.active.push(resource);
return resource;
}
// Aks holda, resursning bo'shatilishini kuting
return new Promise((resolve, reject) => {
// Haqiqiy amalga oshirishda bu yerda taymaut bo'ladi
this.waitQueue.push({ resolve, reject });
});
}
release(resource) {
// Kimdir kutayotganini tekshiring
if (this.waitQueue.length > 0) {
const waiter = this.waitQueue.shift();
// Bu resursni to'g'ridan-to'g'ri kutayotgan mijozga bering
waiter.resolve(resource);
} else {
// Aks holda, uni pulga qaytaring
this.pool.push(resource);
}
// Faol ro'yxatdan olib tashlash
this.active = this.active.filter(r => r !== resource);
}
async close() {
// Puldagi va faol bo'lgan barcha resurslarni yopish
const allResources = [...this.pool, ...this.active];
this.pool = [];
this.active = [];
await Promise.all(allResources.map(r => this.factory.destroy(r)));
}
}
2-qadam: 'PooledResource' o'ramini (wrapper) yaratish
Bu pulni using
sintaksisi bilan bog'laydigan hal qiluvchi qismdir. U resursni va u kelgan pulga havolani saqlaydi. Uning dispose usuli pool.release()
ni chaqiradi.
class PooledResource {
constructor(resource, pool) {
this.resource = resource;
this.pool = pool;
this._isReleased = false;
}
// Bu usul resursni pulga qaytaradi
[Symbol.dispose]() {
if (this._isReleased) {
return;
}
this.pool.release(this.resource);
this._isReleased = true;
console.log('Resurs pulga qaytarildi.');
}
}
// Biz asinxron versiyani ham yaratishimiz mumkin
class AsyncPooledResource {
constructor(resource, pool) {
this.resource = resource;
this.pool = pool;
this._isReleased = false;
}
// Agar bo'shatish asinxron operatsiya bo'lsa, dispose usuli asinxron bo'lishi mumkin
async [Symbol.asyncDispose]() {
if (this._isReleased) {
return;
}
// Bizning oddiy pulimizda, release sinxron, lekin biz shablonni ko'rsatamiz
await Promise.resolve(this.pool.release(this.resource));
this._isReleased = true;
console.log('Asinxron resurs pulga qaytarildi.');
}
}
3-qadam: Barchasini yagona boshqaruvchida birlashtirish
API'ni yanada toza qilish uchun biz pulni o'z ichiga olgan va yo'q qilinadigan o'ramlarni taqdim etadigan boshqaruvchi sinfini yaratishimiz mumkin.
class ResourceManager {
constructor(poolConfig) {
this.pool = new ResourcePool(poolConfig);
}
async getResource() {
const resource = await this.pool.acquire();
// Agar resursingizni tozalash asinxron bo'lishi mumkin bo'lsa, asinxron o'ramdan foydalaning
return new AsyncPooledResource(resource, this.pool);
}
async shutdown() {
await this.pool.close();
}
}
// --- Foydalanish misoli ---
// 1. Soxta resurslarimizni qanday yaratish va yo'q qilishni aniqlang
let resourceIdCounter = 0;
const poolConfig = {
create: async () => {
resourceIdCounter++;
console.log(`#${resourceIdCounter}-sonli resurs yaratilmoqda...`);
return { id: resourceIdCounter, data: `${resourceIdCounter} uchun ma'lumotlar` };
},
destroy: async (resource) => {
console.log(`#${resource.id}-sonli resurs yo'q qilinmoqda...`);
},
min: 1,
max: 3
};
// 2. Boshqaruvchini yarating
const manager = new ResourceManager(poolConfig);
// 3. Shablonni ilova funksiyasida qo'llang
async function processRequest(requestId) {
console.log(`So'rov ${requestId}: Resurs olishga urinish...`);
try {
await using client = await manager.getResource();
console.log(`So'rov ${requestId}: #${client.resource.id}-sonli resurs olindi. Ishlanmoqda...`);
// Bir oz ishni simulyatsiya qilish
await new Promise(resolve => setTimeout(resolve, 500));
// Tasodifiy nosozlikni simulyatsiya qilish
if (Math.random() > 0.7) {
throw new Error(`So'rov ${requestId}: Simulyatsiya qilingan tasodifiy nosozlik!`);
}
console.log(`So'rov ${requestId}: Ish tugallandi.`);
} catch (error) {
console.error(error.message);
}
// `client` bu yerda, muvaffaqiyatli yoki muvaffaqiyatsiz holatlarda avtomatik ravishda pulga qaytariladi.
}
// --- Bir vaqtda so'rovlarni simulyatsiya qilish ---
async function main() {
const requests = [
processRequest(1),
processRequest(2),
processRequest(3),
processRequest(4),
processRequest(5)
];
await Promise.all(requests);
console.log('\nBarcha so\'rovlar tugadi. Pul o\'chirilmoqda...');
await manager.shutdown();
}
main();
Agar siz ushbu kodni (taklifni qo'llab-quvvatlaydigan zamonaviy TypeScript yoki Babel sozlamasi yordamida) ishga tushirsangiz, siz resurslarning maksimal chegaragacha yaratilayotganini, turli so'rovlar tomonidan qayta ishlatilayotganini va har doim pulga qaytarilayotganini ko'rasiz. `processRequest` funksiyasi toza, o'z vazifasiga qaratilgan va resurslarni tozalash mas'uliyatidan butunlay ozod qilingan.
Global auditoriya uchun ilg'or mulohazalar va eng yaxshi amaliyotlar
Bizning misolimiz mustahkam asosni ta'minlasa-da, real dunyodagi, global miqyosda tarqatilgan ilovalar yanada nozik mulohazalarni talab qiladi.
Parallelizm va pul hajmini sozlash
`min` va `max` pul hajmlari muhim sozlash parametrlari hisoblanadi. Yagona sehrli raqam yo'q; optimal hajm ilovangizning yuklamasiga, resurs yaratish kechikishiga va orqa tizim xizmatining chegaralariga (masalan, ma'lumotlar bazangizning maksimal ulanishlari) bog'liq.
- Juda kichik: Ilovangizning oqimlari resursning bo'shashini kutishga juda ko'p vaqt sarflaydi, bu esa unumdorlikda to'siq yaratadi. Bu pul tortishuvi deb nomlanadi.
- Juda katta: Siz ham ilova serveringizda, ham orqa tizimda ortiqcha xotira va protsessorni iste'mol qilasiz. Global miqyosda tarqalgan jamoa uchun bu raqamlar ortidagi sabablarni, ehtimol yuklama sinovlari natijalariga asoslanib, hujjatlashtirish juda muhim, shunda turli mintaqalardagi muhandislar cheklovlarni tushunadilar.
Kutilayotgan yuklamaga asoslangan konservativ raqamlardan boshlang va pul kutish vaqtlari va undan foydalanishni o'lchash uchun ilova unumdorligini monitoring qilish (APM) vositalaridan foydalaning. Shunga mos ravishda sozlang.
Taymaut va xatoliklarni qayta ishlash
Agar pul maksimal hajmda bo'lsa va barcha resurslar ishlatilayotgan bo'lsa nima bo'ladi? Bizning oddiy pulimiz yangi so'rovlarni abadiy kutishga majbur qiladi. Ishlab chiqarish darajasidagi pulda olish taymauti bo'lishi kerak. Agar resurs ma'lum bir vaqt ichida (masalan, 30 soniya) olinmasa, `acquire` chaqiruvi taymaut xatosi bilan muvaffaqiyatsizlikka uchrashi kerak. Bu so'rovlarning cheksiz osilib qolishini oldini oladi va sizga chiroyli tarzda xatolikni qaytarishga imkon beradi, masalan, mijozga `503 Service Unavailable` statusini qaytarish orqali.
Bundan tashqari, pul eskirgan yoki buzilgan resurslarni boshqarishi kerak. Unda resursni berishdan oldin uning hali ham yaroqliligini tekshirishi mumkin bo'lgan tasdiqlash mexanizmi (masalan, `testOnBorrow` funksiyasi) bo'lishi kerak. Agar u buzilgan bo'lsa, pul uni yo'q qilishi va o'rniga yangisini yaratishi kerak.
Freymvorklar va arxitekturalar bilan integratsiya
Ushbu resurslarni boshqarish shabloni alohida usul emas; u kattaroq arxitekturaning asosiy qismidir.
- Bog'liqlik in'ektsiyasi (DI): Biz yaratgan `ResourceManager` DI konteynerida yagona (singleton) xizmat uchun mukammal nomzoddir. Hamma joyda yangi boshqaruvchi yaratish o'rniga, siz bir xil namunani ilovangiz bo'ylab in'ektsiya qilasiz, bu esa hamma bir xil puldan foydalanishini ta'minlaydi.
- Mikroservislar: Mikroservislar arxitekturasida har bir xizmat namunasi ma'lumotlar bazalari yoki boshqa xizmatlarga o'z ulanishlar pulini boshqaradi. Bu nosozliklarni izolyatsiya qiladi va har bir xizmatni mustaqil ravishda sozlash imkonini beradi.
- Serversiz (FaaS): AWS Lambda yoki Google Cloud Functions kabi platformalarda ulanishlarni boshqarish funksiyalarning holatsiz va vaqtinchalik tabiati tufayli mashhur darajada qiyin. Funksiya chaqiruvlari orasida saqlanib qoladigan global ulanish boshqaruvchisi (handler'dan tashqarida global doiradan foydalangan holda) handler ichidagi ushbu `using`/pul shabloni bilan birgalikda ma'lumotlar bazangizni ortiqcha yuklamaslik uchun standart eng yaxshi amaliyot hisoblanadi.
Xulosa: Tozaroq, xavfsizroq va unumdorroq JavaScript yozish
Samarali resurslarni boshqarish professional dasturiy ta'minot muhandisligining belgisidir. Qo'lda va ko'pincha qo'pol bo'lgan try...finally
shablonidan voz kechib, biz yanada barqaror, unumdor va o'qish uchun ancha osonroq kod yozishimiz mumkin.
Keling, biz o'rgangan kuchli strategiyani umumlashtiraylik:
- Muammo: Ma'lumotlar bazasi ulanishlari kabi qimmat, cheklangan tashqi resurslarni boshqarish murakkab. Deterministik tozalash uchun axlat yig'uvchiga ishonish mumkin emas va
try...finally
bilan qo'lda boshqarish ko'p so'zli va xatolarga moyil. - Xavfsizlik tarmog'i: TC39 Resurslarni aniq boshqarish taklifining bir qismi bo'lgan bo'lajak
using
vaawait using
sintaksisi, resurs uchun tozalash mantig'i har doim bajarilishini ta'minlashning deklarativ va deyarli xatosiz usulini taqdim etadi. - Unumdorlik dvigateli: Resurslar puli ā bu mavjud resurslarni qayta ishlatish orqali resurs yaratish va yo'q qilishning yuqori xarajatlaridan qochadigan, vaqt sinovidan o'tgan shablon.
- Sintez: Dispose protokolini (
[Symbol.dispose]
yoki[Symbol.asyncDispose]
) amalga oshiradigan va tozalash mantig'i resursni o'z puliga qaytarish bo'lgan o'ram yaratish orqali biz ikkala dunyoning eng yaxshisiga erishamiz. Biz puldan foydalanishning unumdorliginiusing
operatorining xavfsizligi va oqilonaligi bilan olamiz.
JavaScript yuqori unumdorlikdagi, keng miqyosli tizimlarni yaratish uchun birinchi darajali til sifatida rivojlanishda davom etar ekan, bu kabi shablonlarni qabul qilish endi ixtiyoriy emas. Bu global auditoriya uchun mustahkam, kengaytiriladigan va parvarishlash oson bo'lgan ilovalarning keyingi avlodini yaratish usulimizdir. TypeScript yoki Babel orqali bugunoq o'z loyihalaringizda using
e'lonini sinab ko'rishni boshlang va resurslaringizni boshqarishni aniqlik va ishonch bilan loyihalashtiring.