Future + wait
Future হলো bnlang-এর async মানের প্রতিনিধিত্ব। এটি একটি global builtin — import লাগে না। wait কীওয়ার্ডের সাথে মিলে async কোড synchronous-এর মতো top-to-bottom পড়া যায়।
import "request" as r;
function fetch_user(id) {
var resp = wait r.get("https://api.example.com/users/" + str(id));
return resp.data;
}
function main() {
var user = wait fetch_user(7);
print("hello,", user.name);
}
main().fail(function (e) { print("error:", e); });
একটি Future হয় pending, fulfilled (একটি মান সহ), অথবা rejected (একটি error সহ)। ঠিক একবার transition হয়।
Construct করা
Future(executor)
executor(resolve, reject) synchronously চালায়। প্রথমে যেটা কল হয় সেটাই Future-এর outcome নির্ধারণ করে।
var f = Future(function (resolve, reject) {
timers.set(0, function () { resolve("from timer"); });
});
Executor নিজে throw করলে Future সেই value দিয়ে reject হয়।
Future.of(value)
ইতিমধ্যেই fulfilled একটি Future। value নিজেই একটি Future হলে নতুনটা তার eventual state adopt করে।
Future.of(7).next(function (v) { print(v); }); // 7
Future.err(error)
ইতিমধ্যেই rejected একটি Future।
Future.err("nope").fail(function (e) { print(e); }); // nope
কম্বিনেটর
Future.all(list)
প্রতিটি input fulfill না হওয়া পর্যন্ত অপেক্ষা; তারপর input order-এ মানের list দিয়ে fulfill। যেকোনো একটি reject করলেই সাথে সাথে reject।
var resps = wait Future.all([r.get(url_a), r.get(url_b)]);
Future.race(list)
যে input সবার আগে settle হবে (fulfill বা reject), তার সাথে settle হবে।
Future.all_settled(list)
কখনো reject করে না। প্রতিটি input-এর জন্য একটি result map দিয়ে সবসময় fulfill করে:
Future.all_settled([Future.of("a"), Future.err("b")])
.next(function (rs) {
print(rs[0].ok, rs[0].value); // true a
print(rs[1].ok, rs[1].error); // false b
});
Chain method
| Method | বর্ণনা |
|---|---|
f.next(on_ok) / f.next(on_ok, on_err) | Fulfill হলে on_ok চলে। নতুন Future ফেরত দেয়। |
f.fail(on_err) | Reject হলে on_err চলে। |
f.always(fn) | যাই হোক, fn চলে। মান বা state বদলায় না। |
f.state | snapshot: "pending", "fulfilled", বা "rejected"। |
Callback throw করলে downstream Future সেই মান দিয়ে reject হয়। Callback Future ফেরত দিলে downstream তার state adopt করে।
wait
wait future_expr Future settle না হওয়া পর্যন্ত বর্তমান ফাংশন suspend রাখে; তারপর তার মান ফেরত দেয়। Reject হলে wait throw করে — try/catch-এ ধরা যায়।
সাপোর্টেড পজিশন: top-level statement (var x = wait expr; বা wait expr;), block-এর ভেতরে, if/else, while, for-of, এবং try/catch। এখনো নেই: sub-expression, finally, C-style for, top-level script body।
যেকোনো ফাংশন যার body-তে wait আছে — সে স্বয়ংক্রিয়ভাবে একটি Future ফেরত দেয়। Caller হয় wait করে, নয়তো .next/.fail chain করে।
function load() {
try {
var resp = wait r.get(url);
return resp.body;
} catch (e) {
return "fallback";
}
}
Callback-style API bridge
futurify(fn)
শেষ আর্গুমেন্ট (err, result) callback এমন একটি ফাংশন wrap করে — Future ফেরত দেয়:
function legacy(x, cb) {
timers.set(0, function () { cb(null, x * 100); });
}
var f = futurify(legacy);
var v = wait f(5); // 500
বেশিরভাগ stdlib (request, io, timers.delay, …) ইতিমধ্যেই Future-returning surface দেয়, তাই futurify সাধারণত নিজের callback কোড বা third-party module-এর জন্য।