Inherited from v1.0.0

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.statesnapshot: "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-এর জন্য।

আরও দেখুন

  • request — HTTP verb Future ফেরত দেয়।
  • io*_async ফাইল অপারেশন।
  • timerstimers.delay(ms) async sleep।
  • Keywordswait রেফারেন্স।