অ্যাসিঙ্ক্রোনাস ফ্লো কন্ট্রোল
Bnlang এর রানটাইম একটি সিঙ্গেল-থ্রেডেড ইভেন্ট লুপ (libuv-চালিত) এর উপর তৈরি। দীর্ঘ অপারেশন — ডিস্ক I/O, নেটওয়ার্ক রিকোয়েস্ট, টাইমার — লুপকে ব্লক করে না; এরা একটি কলব্যাক শিডিউল করে যা কাজ শেষ হলে ফায়ার হয়।
এর মানে Bnlang-এ অ্যাসিঙ্ক্রোনাস কোড কলব্যাক-ভিত্তিক। কোনো Promise নেই, async/await কীওয়ার্ডও নেই — কন্ট্রাক্টটি সরল: একটি ফাংশন পাঠান, কল-ব্যাক পান।
Error-First Callbacks
স্ট্যান্ডার্ড লাইব্রেরির যেসব ফাংশন কলব্যাক নেয়, তারা error-first কনভেনশন অনুসরণ করে: প্রথম আর্গুমেন্ট সফল হলে null, ব্যর্থ হলে একটি এরর মেসেজ স্ট্রিং।
import "io" as io;
io.read_file_async("notes.txt", function (err, data) {
if (err != null) {
print("read failed:", err);
return;
}
print("got", data.byte_length, "bytes");
});
Deferring Work with Timers
timers মডিউল একটি কলব্যাক শিডিউল করে যা পরে ইভেন্ট লুপ থেকে ফায়ার হয়।
import "timers" as timers;
print("a");
timers.set(0, function () { print("c — next tick"); });
timers.set(1000, function () { print("d — one second later"); });
print("b");
// Output order:
// a
// b
// c — next tick
// d — one second later
Composing Async Steps
সিকোয়েন্সিয়াল অ্যাসিঙ্ক কাজের জন্য কলব্যাক নেস্ট করুন, অথবা প্রতিটা স্টেপকে নামযুক্ত ফাংশনে ভাগ করুন। হ্যান্ডলার ছোট রাখলে নেস্টিং কম থাকবে।
import "io" as io;
function on_written(err) {
if (err != null) { print("write failed:", err); return; }
io.read_file_async("greeting.txt", on_read);
}
function on_read(err, data) {
if (err != null) { print("read failed:", err); return; }
print("file says:", data);
}
io.write_file_async("greeting.txt", "Hello, async!", on_written);
print("scheduled");
Best Practices
- সবসময় প্রথমে এরর আর্গুমেন্ট চেক করুন; রেজাল্ট ছোঁয়ার আগেই বের হয়ে আসুন।
- নেস্টিং দুই-তিন লেভেলে পৌঁছলে প্রতিটা স্টেপ আলাদা নামযুক্ত ফাংশনে নিয়ে যান।
- আপনার আর প্রয়োজন নেই এমন টাইমার ও স্ট্রিম ক্লিয়ার/বন্ধ করুন — না করলে ইভেন্ট লুপ তাদের জীবিত রাখবে।