Future/Promise — এটি কী, অ্যাসিনক্রোনাস গণনা এবং প্রোগ্রামিং

লেখক: IT Sectr প্রকাশিত: 2026-03-17 পড়ার সময়: 9 মিনিট

Future/Promise হল একটি অ্যাসিনক্রোনাস প্রোগ্রামিং প্যাটার্ন যা এখনও শেষ না হওয়া একটি অপারেশনের ফলাফলের জন্য একটি কন্টেইনার উপস্থাপন করে। Dart Documentation, 2025 অনুসারে, Future হল বিলম্বিত গণনার read-only ফলাফল, Promise হল একটি write-only কন্ট্র্যাক্ট যা এই ফলাফল পূরণ করে। Future Dart, Java, Scala এবং C++-এ then/catch চেইনের জন্য ব্যবহৃত হয়।

মূল পয়েন্ট

  • Future — ভবিষ্যতে উপলব্ধ অ্যাসিনক্রোনাস ফলাফলের জন্য read-only কন্টেইনার
  • Promise — write-only প্লেসহোল্ডার যা ফলাফল গ্রহণ করে এবং Future-এ পাঠায়
  • then চেইন — নেস্টেড callback ছাড়া অ্যাসিনক্রোনাস অপারেশনের ক্রমিক প্রক্রিয়াকরণ
  • Future Dart-এ — async/await এবং dio, http, shelf লাইব্রেরির ভিত্তি
  • Future/Promise — callback প্যাটার্নের বিকল্প এবং async/await সিনট্যাক্সের ভিত্তি

Future/Promise কী?

Future/Promise হল আন্তঃসংযুক্ত অবজেক্টের একটি জোড়া যা একটি অ্যাসিনক্রোনাস ফলাফলকে দুটি ভূমিকায় বিভক্ত করে। Promise ফলাফল (resolve) বা ত্রুটি (reject) লিখতে পারে। Future এটি শুধু পড়তে পারে — callback (then, catchError) বা await-এর মাধ্যমে। এই পৃথকীকরণ নিশ্চিত করে যে ভোক্তা ফলাফল পরিবর্তন করতে পারে না, শুধু ব্যবহার করতে পারে।

Dart-এ Future

Dart ভাষা Future-কে তার প্রধান অ্যাসিনক্রোনাস প্রক্রিয়া হিসেবে ব্যবহার করে। Future<T> ভবিষ্যতে T টাইপের মান পাওয়ার জন্য একটি কন্ট্র্যাক্ট। Future তিনটি অবস্থার একটিতে থাকতে পারে: unresolved (অপারেশন চলছে), resolved with value (সফলভাবে সম্পন্ন), বা resolved with error (ত্রুটি সহ সম্পন্ন)। একবার resolved অবস্থায় যাওয়ার পর, Future কখনো পরিবর্তিত হয় না।

JavaScript-এ Promise

JavaScript-এ Promise Dart-এর Future-এর অনুরূপ, কিন্তু আরও সমৃদ্ধ API সহ। Promise একটি executor নেয় — resolve এবং reject প্যারামিটার সহ একটি ফাংশন। স্ট্যাটিক মেথড Promise.all, Promise.race, Promise.allSettled একাধিক promoses একত্রিত করার অনুমতি দেয়। আধুনিক অ্যাপ্লিকেশন Promise-এর উপরে async/await সিনট্যাক্স ব্যবহার করে।

Future কীভাবে কাজ করে

Future ইভেন্ট লুপের ভিত্তিতে কাজ করে — ইভেন্টের একটি চক্র যা মূল থ্রেড ব্লক না করে অ্যাসিনক্রোনাস অপারেশন প্রক্রিয়া করে। যখন একটি async ফাংশন কল করা হয় (যেমন http.get), এটি অবিলম্বে একটি Future ফেরত দেয়। প্রকৃত অনুরোধ ব্যাকগ্রাউন্ডে চলে, যখন ইভেন্ট লুপ অন্যান্য ইভেন্ট প্রক্রিয়া করতে থাকে। অপারেশন শেষ হওয়ার পর, Future resolved অবস্থায় যায় এবং then কল করা হয়।

ইভেন্ট লুপ হল মূল প্রক্রিয়া যার উপর Dart এবং JavaScript নির্মিত। ইভেন্ট লুপ দুটি সারি বজায় রাখে: মাইক্রোটাস্ক সারি (ছোট কাজ, পরবর্তী ইভেন্টের আগে সম্পাদিত) এবং ইভেন্ট সারি (IO ইভেন্ট, টাইমার)। Future.then মাইক্রোটাস্ক সারিতে একটি callback রাখে, Future.microtask — পরবর্তী ফ্রেমের আগে অগ্রাধিকার সম্পাদন।

then() চেইন callback hell ছাড়া অ্যাসিনক্রোনাস অপারেশন ফলাফলের ক্রমিক প্রক্রিয়াকরণের অনুমতি দেয়। প্রতিটি then() পূর্ববর্তী ধাপের ফলাফল পায় এবং একটি নতুন Future ফেরত দেয়। চেইনের শেষে catchError() যেকোনো ধাপে ঘটে যাওয়া যেকোনো ত্রুটি হ্যান্ডেল করে। এটি অ্যাসিনক্রোনাস কোডকে রৈখিক এবং পঠনযোগ্য করে তোলে।

Java-এ CompletableFuture

Java-তে, CompletableFuture Future/Promise ধারণা প্রসারিত করে। supplyAsync() মেথড ForkJoinPool.commonPool()-এ একটি অ্যাসিনক্রোনাস টাস্ক শুরু করে। thenApply() ফলাফল রূপান্তর করে, thenCompose() নেস্টেড CompletableFuture খোলে। exceptionally() ডিফল্ট মান ফিরিয়ে ত্রুটি হ্যান্ডেল করে। allOf() এবং anyOf() JavaScript-এ Promise.all এবং Promise.race-এর মতো কাজ করে। CompletableFuture complete() এবং completeExceptionally()-এর মাধ্যমে ম্যানুয়াল সমাপ্তি সমর্থন করে — এটি Promise resolve/reject-এর অনুরূপ।

Promise এবং অ্যাসিনক্রোনাস কন্ট্র্যাক্ট

Promise তিনটি অবস্থার একটি সহ একটি কন্ট্র্যাক্ট: pending (মুলতুবি), fulfilled (পূর্ণ), বা rejected (প্রত্যাখ্যাত)। একবার fulfilled বা rejected-এ যাওয়ার পর, Promise কখনো পরিবর্তিত হয় না — এটি সমস্ত ভোক্তার জন্য ফলাফলের অপরিবর্তনীয়তা নিশ্চিত করে। .then() মেথড যেকোনো সম্পূর্ণ অবস্থায় যাওয়ার পর অ্যাসিনক্রোনাসভাবে কল করা হয়।

Promise.all সমস্ত পাস করা promoses সম্পূর্ণ হওয়ার জন্য অপেক্ষা করে এবং একই ক্রমে ফলাফলের একটি অ্যারে ফেরত দেয়। যদি একটি promise ত্রুটির সাথে ব্যর্থ হয় — পুরো Promise.all rejected-এ চলে যায়। Promise.race প্রথম সম্পূর্ণ promise-এর ফলাফল ফেরত দেয় (সফলতা বা ত্রুটি)। Promise.allSettled ত্রুটি নির্বিশেষে সমস্ত promoses-এর জন্য অপেক্ষা করে — প্রতিটির অবস্থা ফেরত দেয়।

চেইনিং হল callbacks-এর উপর Promise-এর মূল সুবিধা। প্রতিটি .then() একটি নতুন Promise ফেরত দেয়, যা নির্বিচারে দৈর্ঘ্যের চেইন অনুমতি দেয়। চেইনের যেকোনো লিংকে ত্রুটি নিকটতম .catch()-এ প্রচারিত হয়। finally() মেথড ফলাফল নির্বিশেষে চেইন সম্পূর্ণ হওয়ার পর কোড কার্যকর করে — রিসোর্স ক্লিনআপের জন্য।

Future কোড উদাহরণ (Dart)

প্রথম উদাহরণ — async ফাংশনের মাধ্যমে Future তৈরি করা এবং then/catchError দিয়ে হ্যান্ডেল করা:

dart
Future<String> fetchData() async {
    await Future.delayed(Duration(seconds: 1))
    return "ডেটা লোড হয়েছে"
}

fetchData()
    .then((result) => print(result))
    .catchError((error) => print("ত্রুটি: $error"))

দ্বিতীয় উদাহরণ — Future.wait-এর সাথে একাধিক Futures একত্রিত করা:

dart
Future<List<String>> loadAll() async {
    final futures = [
        fetchFromApi("/users"),
        fetchFromApi("/posts"),
        fetchFromApi("/comments")
    ]
    final results = await Future.wait(futures)
    return results
}

তৃতীয় উদাহরণ — ম্যানুয়াল তৈরি এবং then চেইন সহ JavaScript-এ Promise:

js
const promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve("সম্পন্ন")
    }, 1000)
})

promise
    .then(value => console.log(value))
    .catch(err => console.error(err))

Future বনাম অন্যান্য অ্যাসিনক্রোনাস প্যাটার্ন

Future/Promise callback শৈলী থেকে আলাদা কারণ এটি আর্গুমেন্ট হিসাবে callback ফাংশন গ্রহণ করার পরিবর্তে একটি কন্ট্র্যাক্ট অবজেক্ট ফেরত দেয়। Callback শৈলী নেস্টিং (callback hell)-এর দিকে নিয়ে যায়, যখন Future সমতল then() চেইন নির্মাণের অনুমতি দেয়। async/await সিনট্যাক্স Future কোডকে আরও রৈখিক করে, সিনক্রোনাস কোডের মতো দেখায়।

Future ঠিক একটি অ্যাসিনক্রোনাস ফলাফল উপস্থাপন করে — একটি নির্গমন, যার পরে Future সম্পূর্ণ হয়। Observable (Rx, ReactiveX) বা Flow (Kotlin Coroutines)-এর বিপরীতে, Future সময়ের সাথে একাধিক মান সমর্থন করে না। যদি আপনার ইভেন্টের স্ট্রিম প্রয়োজন হয় — Dart-এ Stream, Rx-এ Observable, বা Kotlin-এ Flow ব্যবহার করুন।

Java-তে CompletableFuture বিস্তৃত API সহ Promise-এর একটি অ্যানালগ: supplyAsync, thenApply, thenCompose, exceptionally। CompletableFuture allOf, anyOf-এর মাধ্যমে একাধিক অ্যাসিনক্রোনাস অপারেশন একত্রিত করার অনুমতি দেয় এবং এক্সিকিউশনের জন্য কাস্টম Executor নির্দিষ্ট করারও অনুমতি দেয়। Scala Future থ্রেড পুল পরিচালনার জন্য ExecutionContext ব্যবহার করে এবং for-comprehension-এর মাধ্যমে কম্পোজিশন সমর্থন করে।

Dart-এ, Future প্যাটার্ন JavaScript Promise থেকে আলাদা কারণ Dart-এ কঠোর টাইপিং রয়েছে: Future<String> রিটার্ন মানের টাইপ গ্যারান্টি দেয়। Dart-এ async ফাংশনগুলিকে Future ফেরত দিতে হয়, এবং কম্পাইলার চেক করে যে সমস্ত পাথ সঠিক টাইপ ফেরত দেয়। Future.wait Promise.all-এর সমতুল্য — এটি Iterable<Future<T>> নেয় এবং Future<List<T>> ফেরত দেয়। Future.delayed এবং Future.error অ্যাসিনক্রোনাস দৃশ্যপট পরীক্ষার জন্য সুবিধাজনক ফ্যাক্টরি।

Future/Promise Python-এ concurrent.futures.Future এবং asyncio.Future-এর মাধ্যমে প্রয়োগ করা হয়েছে। concurrent.futures.ThreadPoolExecutor.submit() একটি Future ফেরত দেয়, যার উপর result() কল করা যেতে পারে — একটি ব্লকিং কল। asyncio.Future হল Asyncio-তে অ্যাসিনক্রোনাস ফলাফলের জন্য await-সামঞ্জস্যপূর্ণ কন্টেইনার। asyncio.gather() সমান্তরালে একাধিক coroutines চালায় এবং ফলাফলের তালিকা ফেরত দেয়, JavaScript-এ Promise.all-এর মতো। Python অ্যাসিনক্রোনাস অপারেশন কম্পোজ করার জন্য callback-ভিত্তিক asyncio.ensure_future এবং add_done_callback চেইনও ব্যবহার করে, কিন্তু আধুনিক কোডে asyncio.Task সহ async/await সিনট্যাক্স পছন্দ করা হয়।

মোবাইল ডেভেলপমেন্টে, Future Flutter অ্যাপ্লিকেশনে সক্রিয়ভাবে ব্যবহৃত হয়। http বা dio প্যাকেজের প্রতিটি নেটওয়ার্ক অনুরোধ Future ফেরত দেয়। FutureBuilder একটি উইজেট যা একটি Future এবং snapshot অবস্থা নেয়: connectionDone, hasData, hasError। যখন ডেটা পাওয়া যায়, snapshot.data-তে Future ফলাফল থাকে। StreamBuilder একাধিক মানের জন্য অ্যানালগ। FutureBuilder setState-এর মাধ্যমে ম্যানুয়াল লোডিং অবস্থা পরিচালনা দূর করে।

Scala Future অন্তর্নিহিতভাবে ExecutionContext ব্যবহার করে — থ্রেড পুল যার উপর অ্যাসিনক্রোনাস টাস্ক কার্যকর হয়। map, flatMap, filter-এর মাধ্যমে কম্পোজিশন কাজ করে কারণ Future একটি monad। for-comprehension নেস্টিং ছাড়া ক্রমিকভাবে একাধিক Futures একত্রিত করার অনুমতি দেয়: for { a <- futureA; b <- futureB } yield a + b. Future.sequence Promise.all-এর মতো কাজ করে। ত্রুটি পুনরুদ্ধার recover এবং recoverWith-এর মাধ্যমে প্রয়োগ করা হয়।

C++-এ Future/Promise <future> লাইব্রেরি থেকে std::future এবং std::promise ক্লাস দ্বারা উপস্থাপিত। std::async একটি অ্যাসিনক্রোনাস ফাংশন শুরু করে এবং std::future ফেরত দেয়। std::promise set_value()-এর মাধ্যমে ম্যানুয়ালি মান বা set_exception()-এর মাধ্যমে ত্রুটি সেট করার অনুমতি দেয়। Dart এবং JavaScript-এর বিপরীতে, std::future.get() ফলাফল পাওয়া পর্যন্ত থ্রেড ব্লক করে — এটি একটি গুরুত্বপূর্ণ পার্থক্য যা মাল্টিথ্রেডেড C++ অ্যাপ্লিকেশন ডিজাইন করার সময় বিবেচনা করা উচিত।

Future প্যাটার্ন

Future ফেরত দেয় এমন APIs ডিজাইন করার সময়, একক সত্যের উৎস নিয়ম অনুসরণ করুন: প্রতিটি অ্যাসিনক্রোনাস অনুরোধ একবার তৈরি করা হয় এবং Future.memoize-এর মাধ্যমে ক্যাশ করা হয়। যদি দুটি কম্পোনেন্ট একই ডেটার অনুরোধ করে, তারা একই Future পায় — এটি ডুপ্লিকেট অনুরোধ প্রতিরোধ করে। টাইমআউটের জন্য, Future.timeout (Dart) বা টাইমআউট সহ Promise.race ব্যবহার করুন যাতে নিশ্চিত করা যায় অ্যাসিনক্রোনাস অপারেশন একটি নির্দিষ্ট ব্যবধানের মধ্যে সম্পূর্ণ হয়।

Future-এ Retry প্যাটার্ন একটি পুনরাবৃত্ত চেইনের মাধ্যমে প্রয়োগ করা হয়: catch-এ ত্রুটিতে, একই অ্যাসিনক্রোনাস ফাংশন বিলম্বের সাথে কল করা হয়। Exponential backoff প্রচেষ্টার মধ্যে ব্যবধান বাড়ায়: 1 সেকেন্ড — 2 সেকেন্ড — 4 সেকেন্ড — সর্বোচ্চ 30 সেকেন্ড পর্যন্ত। Dart-এ এটি Future-এ এক্সটেনশনে এনক্যাপসুলেট করা হয়েছে: future.retry(maxRetries: 3, delay: Duration(seconds: 1))। Scala-তে, Future.zip দুটি স্বাধীন ফলাফলকে একটি tuple-এ একত্রিত করে — দুটি Future-এর জন্য Promise.all-এর বিকল্প। স্ট্যান্ডার্ড Future-এ বাতিলকরণ সমর্থিত নয়, কিন্তু JavaScript-এ CancellationToken বা AbortController-এর মাধ্যমে প্রয়োগ করা হয়।

সচরাচর জিজ্ঞাসিত প্রশ্ন

Future এবং Promise-এর মধ্যে পার্থক্য কী?

Future then বা await-এর মাধ্যমে অ্যাসিনক্রোনাস ফলাফল পড়ার জন্য read-only কন্টেইনার। Promise হল একটি write-only কন্ট্র্যাক্ট যা resolve()-এর মাধ্যমে মান গ্রহণ করে এবং Future-এর সাথে লিঙ্ক করে। Dart এবং JavaScript-এ, এই ধারণাগুলো একত্রিত: Future/Promise একটি ক্লাস। Java এবং Scala-তে এগুলো পৃথক।

Future Observable থেকে কীভাবে আলাদা?

Future একটি একক অ্যাসিনক্রোনাস ফলাফল উপস্থাপন করে — এটি ঠিক একটি মান নির্গত করে এবং সম্পূর্ণ হয়। Observable (Rx) সময়ের সাথে একাধিক মান নির্গত করে — এটি একটি অ্যাসিনক্রোনাস স্ট্রিম। যদি আপনার একটি HTTP প্রতিক্রিয়া প্রয়োজন — Future ব্যবহার করুন। যদি আপনার ডাটাবেস পরিবর্তনের স্ট্রিম প্রয়োজন — Observable বা Stream ব্যবহার করুন।

async/await কী এবং এটি Future-এর সাথে কীভাবে সম্পর্কিত?

async/await Future/Promise-এর উপর সিনট্যাক্টিক সুগার। async কীওয়ার্ড ফাংশনকে অ্যাসিনক্রোনাস হিসাবে চিহ্নিত করে — এটি Future ফেরত দেয়। await থ্রেড ব্লক না করে Future সম্পূর্ণ হওয়া পর্যন্ত এক্সিকিউশন বিরতি দেয়। Dart, JavaScript, Python এবং C#-এ, async/await বেশিরভাগ দৃশ্যপটে then চেইন প্রতিস্থাপন করেছে।

Future চেইনে ত্রুটিগুলি কীভাবে হ্যান্ডেল করবেন?

Dart-এ, চেইনের শেষে .catchError() ব্যবহার করুন — এটি যেকোনো পর্যায়ে ব্যতিক্রম ধরে। JavaScript-এ — .catch()। Dart-এ async ফাংশনের ভিতরে try/await/catch-ও উপলব্ধ। ত্রুটি পুনরুদ্ধারের জন্য, ডিফল্ট মান বা নতুন Future ফিরিয়ে .catchError() ব্যবহার করুন।

Promise.all কী এবং কখন এটি ব্যবহার করবেন?

Promise.all promoses-এর একটি অ্যারে নেয় এবং একটি একক Promise ফেরত দেয় যা ফলাফলের অ্যারে সহ সমাধান হয়। সমস্ত promoses সমান্তরালে চলে — এটি স্বাধীন অপারেশনগুলিকে গতি দেয় (যেমন, একাধিক ফাইল লোড করা)। যদি কোনো promise প্রত্যাখ্যাত হয় — পুরো Promise.all একই ত্রুটির সাথে প্রত্যাখ্যাত হয়।

সারাংশ

  • Future/Promise — একক মানের জন্য কন্ট্র্যাক্ট সহ অ্যাসিনক্রোনাস প্রোগ্রামিং প্যাটার্ন
  • Future — অপারেশন ফলাফল পড়ার জন্য read-only কন্টেইনার
  • Promise — resolve/reject-এর মাধ্যমে Future পূরণকারী write-only কন্ট্র্যাক্ট
  • then চেইন — callback hell ছাড়া অ্যাসিনক্রোনাস ধাপের সমতল প্রক্রিয়াকরণ
  • async/await — Future-এর উপর সিনট্যাক্টিক সুগার, কোডকে রৈখিক করে
  • Promise.all — একাধিক অ্যাসিনক্রোনাস অপারেশনের সমান্তরাল সম্পাদন
  • সময়ের সাথে একাধিক মানের জন্য Stream বা Observable ব্যবহার করুন, Future নয়

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন