Future কি?
Async কম্পিউটেশন ইমিডিয়েট রেজাল্ট প্রোভাইড করতে পারেনা। যেমনটা ধরো, লোকাল ডাটাবেজ থেকে কুয়েরি করে ডাটা আনতে হবে। যেটা সময় সাপেক্ষ বেপার। ডার্টে Future হলো একটা ভ্যালু যেইটার রেজাল্ট টা ফিউচারে এভেইলেবল হবে।
সাধারণত আমরা Future করি যেসব কাজেঃ
- সার্ভার থেকে ডাটা আনার সময়।
- ডাটাবেজ কুয়েরি
- ফাইল থেকে রিড/রাইট করার জন্যে
- লং রানিং ও সিপিউ ইন্টেন্সিভ টাস্ক
একটা উদাহরন দিয়ে দেখা যাকঃ
Future fetchData() async { await Future.delayed(const Duration(seconds: 2)); return 'NetworkData'; } void main() { print(fetchData()); fetchData().then(print); }
আউটপুটঃ
Instance of '_Future' NetworkData
আউটপুটের দিকে খেয়াল করলে দেখা যাবে প্রথমে প্রিন্ট হইছে Instance of ‘_Future‘ ঠিক তার ২ সেকেন্ড পরে প্রিন্ট হইছে একচুয়াল ভ্যালু। প্রথমে এটা কনফিউজিং মনে হবে। আসলে প্রথম লাইনে এমন আউটপুট হবার কারন হলো আমাদের এই ভ্যালু টা পেতে অপেক্ষা করতে হতো ২ সেকেন্ড কিন্তু আমরা সেটা না করেই প্রিন্ট করার চেষ্টা করেছি। পরের লাইনে আমদের ঠিক মত ভ্যালু আসছে কারন আরা then কলব্যাক দিয়ে আমরা ওয়েট করেছি ভ্যালুর জন্যে।
আমরা মেইনলি দুই ভাবে Future ভ্যালুর জন্য ওয়েট করতে পারি, await ও then কলব্যাক। আমরা আগে দেখেছি await মুলত ব্যবহার হয় async কোড কে sync ওয়ে তে রান করার জন্য await মুলত কোড এক্সিকিউশন থামায়ে দেয় যতক্ষন না ওই পার্টিকুলার টাস্ক টা কমপ্লিট হয়। অপর দিকে then কলব্যাক নন ব্লকিং কোডের অন্য পার্ট আমাদের রানিং রাখে। then কলব্যাক দিয়ে sync ওয়ে পেতে হলে কলব্যাকের মধে বাকি কোড গুলা লিখতে হবে।
আমাদের ইউজকেস দেখে আসলে ডিসিশন নিতে হয় যে কখন কোন মেথড ইউজ করব। আরেক টা ব্যাপার আমদের যদি এমন ইউজকেস আসে যে আমার ভ্যালুর জন্যে ওয়েট করার দরকার নেই যাস্ট ফাংশন কল দিলেই হবে তাহলে সেটা await না করলেও চলবে। যেমনঃ সার্ভারে ইভেন্ট স্ট্রিম ডাটা লগের জন্যে। এটা মুলত Fire & Forget টাস্ক।