অ্যাসিঙ্ক্রোনাস ফ্লো কন্ট্রোল

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

  • সবসময় প্রথমে এরর আর্গুমেন্ট চেক করুন; রেজাল্ট ছোঁয়ার আগেই বের হয়ে আসুন।
  • নেস্টিং দুই-তিন লেভেলে পৌঁছলে প্রতিটা স্টেপ আলাদা নামযুক্ত ফাংশনে নিয়ে যান।
  • আপনার আর প্রয়োজন নেই এমন টাইমার ও স্ট্রিম ক্লিয়ার/বন্ধ করুন — না করলে ইভেন্ট লুপ তাদের জীবিত রাখবে।