सुनने की विधि में async* जोड़ते समय यह फ़ंक्शन बॉडी को निष्पादित नहीं कर रहा है
import 'dart:async';
main(List<String> args) {
print('====');
tranStream();
}
Stream<int> intStreamer() async* {
int c = 0;
while (c <= 30) {
await Future.delayed(Duration(seconds: 1));
yield c++;
}
}
tranStream() {
intStreamer().listen((event) async* { // If i remove async* from here it will execute print statement
print(event);
});
}
अगर मैं intStreamer().listen
से async* हटा दूं तो यह प्रिंट स्टेटमेंट निष्पादित करेगा। यहाँ क्या हो रहा है?
1 उत्तर
जब आप async*
का उपयोग कर रहे हैं, तो विधि केवल तभी क्रियान्वित होने लगेगी जब लौटे Stream
को ग्राहक मिल जाएगा। आपका कोड वास्तव में कोई मतलब नहीं रखता है क्योंकि listen
एक विधि लेता है जो void
लौटाता है। इसलिए कोई भी लौटाए गए Stream
पर सुनने वाला नहीं है, जो दी गई विधि स्वचालित रूप से वापस आ जाएगी (async*
कीवर्ड के आधार पर)।
मैं आपके कोड को ठीक से फिर से लिखूंगा ताकि आप listen
के बजाय await for
का उपयोग करें जो मुझे लगता है कि यह और अधिक स्पष्ट करता है कि क्या होता है:
import 'dart:async';
Future<void> main(List<String> args) async {
print('====');
await tranStream();
}
Stream<int> intStreamer() async* {
int c = 0;
while (c <= 30) {
await Future<void>.delayed(const Duration(seconds: 1));
yield c++;
}
}
Future<void> tranStream() async {
await for (final event in intStreamer()) {
print(event);
}
}
tranStream
के उदाहरण के साथ अपडेट एक स्ट्रीम लौटाता है:
import 'dart:async';
Future<void> main(List<String> args) async {
print('====');
await for (final event in tranStream()) {
print('main got: $event');
}
}
Stream<int> intStreamer() async* {
int c = 0;
while (c <= 30) {
await Future<void>.delayed(const Duration(seconds: 1));
yield c++;
}
}
Stream<int> tranStream() async* {
await for (final event in intStreamer()) {
print('tranStream got: $event');
yield event;
}
}
संबंधित सवाल
नए सवाल
dart
डार्ट वेब और मोबाइल अनुप्रयोगों के निर्माण के लिए एक वर्ग-आधारित, सांख्यिकीय रूप से (और दृढ़ता से) -प्रचलित प्रोग्रामिंग भाषा है। डार्ट ब्राउज़र में चलाने के लिए आधुनिक जावास्क्रिप्ट को संकलित करता है और देशी कोड को एंड्रॉइड और आईओएस जैसे मोबाइल प्लेटफॉर्म पर चलाने के लिए संकलित करता है। Dart स्क्रिप्टिंग और सर्वर-साइड ऐप्स के लिए कमांड-लाइन पर भी चलता है।
await for
समाधान का उपयोग करना इसे काफी आसान बना देना चाहिए? आप बसtranStream
कोasync*
के रूप में चिह्नित कर सकते हैं, एकStream
वापस कर सकते हैं औरyield
का उपयोग कर सकते हैं जैसा कि आप सामान्य रूप से करते हैं? मैंने एक उदाहरण के साथ अपना जवाब अपडेट कर लिया है।Stream
की सदस्यता ले सकते हैं और जो चाहें कर सकते हैं। मैं भाषा भ्रमण में स्ट्रीम के बारे में अधिक पढ़ने की अनुशंसा कर सकता हूं: dart.dev/guides/ भाषा/भाषा-दौरे#हैंडलिंग-स्ट्रीम