मैं स्पंदन ढांचे का उपयोग करके एक एप्लिकेशन बना रहा हूं। इस दौरान मैं डार्ट asyncऔर कीवर्ड्स के साथ आया async*। क्या कोई मुझे बता सकता है कि उनके बीच क्या अंतर है?
मैं स्पंदन ढांचे का उपयोग करके एक एप्लिकेशन बना रहा हूं। इस दौरान मैं डार्ट asyncऔर कीवर्ड्स के साथ आया async*। क्या कोई मुझे बता सकता है कि उनके बीच क्या अंतर है?
जवाबों:
फ़ंक्शन को चिह्नित करना asyncया async*इसे उपयोग करने के लिए async/ awaitकीवर्ड का उपयोग करने की अनुमति देता है Future।
दोनों के बीच अंतर यह है कि async*हमेशा एक रिटर्न होगा Streamऔर yieldकीवर्ड के माध्यम से एक मूल्य का उत्सर्जन करने के लिए कुछ सिंटैक्स चीनी की पेशकश करेगा ।
इसलिए हम निम्न कार्य कर सकते हैं:
Stream<int> foo() async* {
for (int i = 0; i < 42; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
यह फ़ंक्शन हर सेकंड एक मूल्य का उत्सर्जन करता है, जो हर बार वेतन वृद्धि करता है
async आपको देता है a Futureasync*आपको देता है a Stream।आप उस asyncकीवर्ड को एक फंक्शन में जोड़ते हैं जो कुछ काम करता है जिसमें एक लंबा समय लग सकता है। यह एक में लिपटे परिणाम देता है Future।
Future<int> doSomeLongTask() async {
await Future.delayed(const Duration(seconds: 1));
return 42;
}
आप भविष्य की प्रतीक्षा करके वह परिणाम प्राप्त कर सकते हैं:
main() async {
int result = await doSomeLongTask();
print(result); // prints '42' after waiting 1 second
}
आप async*एक फ़ंक्शन बनाने के लिए कीवर्ड जोड़ते हैं जो एक समय में भविष्य के मूल्यों का एक गुच्छा लौटाता है। परिणाम एक स्ट्रीम में लिपटे हुए हैं।
Stream<int> countForOneMinute() async* {
for (int i = 1; i <= 60; i++) {
await Future.delayed(const Duration(seconds: 1));
yield i;
}
}
इसके लिए तकनीकी शब्द एसिंक्रोनस जनरेटर फ़ंक्शन है । आप फ़ंक्शन को छोड़ने के yieldबजाय एक मान वापस करने के लिए उपयोग returnकरते हैं।
आप await forस्ट्रीम द्वारा उत्सर्जित प्रत्येक मूल्य की प्रतीक्षा करने के लिए उपयोग कर सकते हैं ।
main() async {
await for (int i in countForOneMinute()) {
print(i); // prints 1 to 60, one integer per second
}
}
अधिक जानने के लिए ये वीडियो देखें, विशेष रूप से जेनरेटर पर एक:
Dart Documentationसाथ ही साथ संदर्भ को पढ़ने के लिए अच्छा है :)