JSON, Async/Await ও Errors
- JSON.stringify ও JSON.parse দিয়ে object ↔ টেক্সট রূপান্তর করতে পারবেন
- try/catch দিয়ে ভাঙা ইনপুট নিরাপদে সামলাতে এবং throw দিয়ে নিজের এরর তৈরি করতে পারবেন
- async function ও await দিয়ে Promise-ভিত্তিক কোড লিখতে এবং fixture বনাম আসল API-র পার্থক্য বলতে পারবেন
সমস্যাটা কী?
অর্ডার সিস্টেম থেকে টেক্সট আসে {"id":"ORD-17","status":"shipped"}। কখনো কখনো ভাঙা টেক্সট আসে ({"id":"ORD-18",), আর পুরো পেজ crash করে। তার ওপর, সার্ভার উত্তর দিতে ২ সেকেন্ড নেয়—কোড কি এই সময় অন্য সব কাজ থামিয়ে বসে থাকবে?
শেখার লক্ষ্য
- JSON.stringify ও JSON.parse দিয়ে object ↔ টেক্সট রূপান্তর করতে পারবেন
- try/catch দিয়ে ভাঙা ইনপুট নিরাপদে সামলাতে এবং throw দিয়ে নিজের এরর তৈরি করতে পারবেন
- async function ও await দিয়ে Promise-ভিত্তিক কোড লিখতে এবং fixture বনাম আসল API-র পার্থক্য বলতে পারবেন
পূর্বশর্ত
ব্যাখ্যা
JSON (JavaScript Object Notation): object/array-কে টেক্সটে লেখার নিয়ম। key সবসময় ডাবল কোটেশনে; string, number, boolean, null, array, object চলে; function বা undefined চলে না।
const order = { id: "ORD-17", items: 2, paid: true };
const text = JSON.stringify(order); // object → টেক্সট
const back = JSON.parse(text); // টেক্সট → objectএরর হ্যান্ডলিং (error handling): JSON.parse ভাঙা টেক্সট পেলে exception ছোড়ে (throw)। try { … } catch (err) { … } সেটি ধরে, যাতে প্রোগ্রাম থেমে না যায়। নিজেও throw new Error("বার্তা") দিয়ে এরর ছোড়া যায়—যেমন অর্ডার নম্বর খালি হলে।
প্রমিস (Promise): এমন একটি মান যা “পরে আসবে”। async/await (async/await): async function-এর ভেতরে await লিখলে সেই Promise শেষ না হওয়া পর্যন্ত ওই function অপেক্ষা করে, কিন্তু বাকি প্রোগ্রাম আটকে থাকে না। async function নিজেও একটি Promise ফেরত দেয়।
| লোকাল fixture (এই পাঠ) | আসল নেটওয়ার্ক কল | |
|---|---|---|
| ডেটা কোথা থেকে | কোডের ভেতরে লেখা নমুনা | অন্য কম্পিউটারের সার্ভার |
| সময় | প্রায় তাৎক্ষণিক | মিলিসেকেন্ড থেকে সেকেন্ড; অনিশ্চিত |
| ব্যর্থতা | শুধু আমরা যা সিমুলেট করি | নেটওয়ার্ক বিচ্ছিন্ন, timeout, 500 এরর, rate limit |
| নিরাপত্তা | কোনো তথ্য বাইরে যায় না | API key, ব্যক্তিগত ডেটা সাবধানে সামলাতে হয় |
এই রানারে fetch নেই—ইচ্ছাকৃত। তাই আমরা Promise.resolve(...) দিয়ে fixture বানাব। কোডের কাঠামো (async/await, try/catch) আসল API-তেও একই থাকবে; অধ্যায় ১১-এ timeout ও retry যোগ করব।
উপমা — এবং কোথায় ভাঙে
উপমা: async/await হলো রেস্তোরাঁয় অর্ডার দিয়ে টোকেন নেওয়া: খাবার তৈরি হওয়া পর্যন্ত আপনি অন্য কাজ করতে পারেন, টোকেন ডাকলে (await শেষ) খাবার নেন। try/catch হলো “খাবার শেষ হয়ে গেলে বিকল্প অর্ডার” পরিকল্পনা।
কোথায় ভাঙে: রেস্তোরাঁ সাধারণত খাবার দেয়ই; নেটওয়ার্ক কল কখনো উত্তরই না দিতে পারে (চিরকাল ঝুলে থাকা)—তাই বাস্তবে timeout লাগে, যা এই উপমায় নেই।
ধাপে ধাপে উদাহরণ
ধাপে ধাপে: fixture থেকে অর্ডার আনা, JSON parse করা, ভুল সামলানো।
const fixtures = {
"ORD-17": '{"id":"ORD-17","status":"shipped"}',
"ORD-18": '{"id":"ORD-18",', // ইচ্ছাকৃত ভাঙা
};
function fakeFetchOrder(id) { // আসল API-র নকল
return Promise.resolve(fixtures[id]);
}
async function getStatus(id) {
const text = await fakeFetchOrder(id);
try {
return JSON.parse(text).status;
} catch (err) {
return "ডেটা ভাঙা: " + err.name;
}
}getStatus("ORD-17")কল → await fixture-এর টেক্সট পায় → parse → "shipped"।getStatus("ORD-18")→ parse ব্যর্থ → SyntaxError ধরা পড়ে → "ডেটা ভাঙা: SyntaxError"।getStatus("ORD-99")→ fixture-এ নেই → text = undefined →JSON.parse(undefined)-ও SyntaxError। ভালো কোডে আগেই “অর্ডার পাওয়া যায়নি” বলা উচিত।
অনুশীলন / অ্যাক্টিভিটি
console.log আউটপুট দেখায়। ব্রাউজারের DOM, নেটওয়ার্ক (fetch), টাইমার বা ফাইল এখানে নেই—ইচ্ছাকৃতভাবে। Ctrl/⌘ + Enter চাপলেও Run হয়।fixture দিয়ে async/await ও এরর
// লোকাল fixture — আসল নেটওয়ার্ক নয়
const fixtures = {
"ORD-17": '{"id":"ORD-17","status":"shipped","items":2}',
"ORD-18": '{"id":"ORD-18",',
};
function fakeFetchOrder(id) {
if (!id) {
return Promise.reject(new Error("অর্ডার নম্বর খালি"));
}
return Promise.resolve(fixtures[id]);
}
async function getStatus(id) {
try {
const text = await fakeFetchOrder(id);
if (text === undefined) {
throw new Error("অর্ডার পাওয়া যায়নি: " + id);
}
const order = JSON.parse(text);
return order.id + " → " + order.status;
} catch (err) {
return "সমস্যা (" + err.name + "): " + err.message;
}
}
async function main() {
console.log("শুরু");
for (const id of ["ORD-17", "ORD-18", "ORD-99", ""]) {
console.log(await getStatus(id));
}
console.log("JSON আবার:", JSON.stringify({ id: "ORD-17", ok: true }));
}
main();
console.log("main() কল হয়েছে — কিন্তু ফল এখনও আসেনি!");লাইন ধরে বুঝি
Promise.reject(new Error(...)): ব্যর্থ Promise—await করলে এটি exception হিসেবে ছোড়ে, তাই catch ধরে।const text = await fakeFetchOrder(id): Promise-এর ভেতরের মান বের করে; ব্যর্থ হলে throw।throw new Error("অর্ডার পাওয়া যায়নি"): নিজের এরর; বার্তাটি err.message-এ যায়, ধরনটি err.name ("Error")।err.name: JSON ভাঙলে "SyntaxError", নিজের হলে "Error"—এভাবে ধরন আলাদা করা যায়।- শেষ লাইনটি main-এর ভেতরের await-গুলোর আগে ছাপা হয়—async কাজ “পরে” শেষ হয়, এটাই execution flow।
এখানে এটা কেন ব্যবহার করেছি?
LLM API-র উত্তর (অধ্যায় ১১) JSON-এ আসে এবং কখনো ভাঙা বা স্কিমার বাইরে থাকে; নেটওয়ার্ক কল async এবং ব্যর্থ হতে পারে। এখনই try/catch ও await-এর অভ্যাস হলে পরের অধ্যায়ে শুধু timeout/retry যোগ করতে হবে।
কোন বিষয়গুলো মনে রাখব?
- JSON = টেক্সট; parse করে object, stringify করে টেক্সট
- বাইরের ডেটা parse করতে সবসময় try/catch
- await শুধু async function-এর ভেতরে
- fixture ≠ আসল API: সময়, ব্যর্থতা, নিরাপত্তা আলাদা
এখনই কোনগুলো মুখস্থ করতে হবে না?
- Promise.all, Promise.race
- event loop-এর microtask/macrotask বিস্তারিত
- fetch API-র সব অপশন
নিজে পরিবর্তন করে দেখুন
fixtures-এ "ORD-19": '{"id":"ORD-19"}' যোগ করুন (status নেই)। আউটপুটে কী আসে? “ORD-19 → undefined” দেখালে সেটি কি ব্যবহারকারীর জন্য ভালো বার্তা? কোড বদলে “স্ট্যাটাস জানা নেই” দেখান।
সাধারণ ভুল
- JSON-এ সিঙ্গেল কোটেশনে key লেখা—{'id': 1} বৈধ JSON নয়
- await ছাড়া async function কল করে ফল ব্যবহার করা (Promise পাবেন, মান নয়)
- catch-এ এরর চুপচাপ গিলে ফেলা, কিছু না জানানো
- fixture-এ কাজ করলেই ধরে নেওয়া আসল API-তেও করবে
জ্ঞান যাচাই
নিচের 3টি প্রশ্নের উত্তর দিয়ে “জমা দিন” চাপুন। স্কোর সার্ভারে যাচাই হয়; প্রতিটি উত্তরের পর কেন সঠিক বা ভুল তা দেখাবে। লগইন থাকলে ফল আপনার অগ্রগতিতে সংরক্ষিত হয়।
সংক্ষেপে মনে রাখুন
- JSON: ডেটার সাধারণ ভাষা
- try/catch/throw: ব্যর্থতা নিয়ন্ত্রিতভাবে সামলানো
- async/await: অপেক্ষার কাজ, প্রোগ্রাম আটকায় না
- fixture দিয়ে শিখি, আসলের পার্থক্য মনে রাখি
পরবর্তী পাঠ
কোড ভুল হলে কীভাবে খুঁজবেন—পরের পাঠ ব্যবহারিক debugging: Practical Debugging
সূত্র ও যাচাই
জ্ঞান যাচাই
আপনার শেখার অগ্রগতি সংরক্ষণ করতে লগইন করুন।
এখানে প্রশ্ন করুন
আপনার শেখার অগ্রগতি সংরক্ষণ করতে লগইন করুন।