Dart में Async और Async * के बीच क्या अंतर है?


88

मैं स्पंदन ढांचे का उपयोग करके एक एप्लिकेशन बना रहा हूं। इस दौरान मैं डार्ट asyncऔर कीवर्ड्स के साथ आया async*। क्या कोई मुझे बता सकता है कि उनके बीच क्या अंतर है?

जवाबों:


119

फ़ंक्शन को चिह्नित करना 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;
  }
}

यह फ़ंक्शन हर सेकंड एक मूल्य का उत्सर्जन करता है, जो हर बार वेतन वृद्धि करता है


3
आपको जोड़ना चाहिए कि आपको उदाहरण कहां मिलता है, Dart Documentationसाथ ही साथ संदर्भ को पढ़ने के लिए अच्छा है :)
Skizo-oz'S

3
@ Skizo-ozᴉʞS लिंक मृत है। सबसे अच्छा डॉक्टर जो मुझे इस पर मिल सकता है वह है: dart.dev/tutorials/language/streams
wdev

1
किसी फ़ंक्शन को async के रूप में चिह्नित करके * हम उपज कीवर्ड का उपयोग करने और डेटा की स्ट्रीम को वापस करने में सक्षम हैं।
यश

80

संक्षिप्त जवाब

  • async आपको देता है a Future
  • async*आपको देता है a Stream

async

आप उस 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 *

आप 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
  }
}

पर जा रहा

अधिक जानने के लिए ये वीडियो देखें, विशेष रूप से जेनरेटर पर एक:


2
'ये वीडियो देखें' - यदि आप पाठ के संदर्भ भी प्रदान कर सकें तो बहुत अच्छा होगा । हर कोई वीडियो का शौकीन नहीं होता ...
एकॉनगुआ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.