सुनने की विधि में 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* हटा दूं तो यह प्रिंट स्टेटमेंट निष्पादित करेगा। यहाँ क्या हो रहा है?

0
arunized 21 अप्रैल 2021, 14:47

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;
  }
}
1
julemand101 21 अप्रैल 2021, 15:57
ठीक। लेकिन क्या होगा अगर मैं चाहता हूं कि ट्रैनस्ट्रीम() इसे सुनकर intStreamer() से एक स्ट्रीम लौटाए। मैं async* के साथ सुनने के कॉलबैक से कैसे प्राप्त करूं?
 – 
arunized
21 अप्रैल 2021, 15:51
मेरे await for समाधान का उपयोग करना इसे काफी आसान बना देना चाहिए? आप बस tranStream को async* के रूप में चिह्नित कर सकते हैं, एक Stream वापस कर सकते हैं और yield का उपयोग कर सकते हैं जैसा कि आप सामान्य रूप से करते हैं? मैंने एक उदाहरण के साथ अपना जवाब अपडेट कर लिया है।
 – 
julemand101
21 अप्रैल 2021, 15:55
हाँ, यह काम करेगा। आपकी सहायता के लिए धन्यवाद। 1 और संदेह है कि क्या होगा यदि intStreamer() अतुल्यकालिक जनरेटर नहीं है, लेकिन एक StreamController है जो घटनाओं को बेतरतीब ढंग से उत्सर्जित करेगा, इसलिए प्रतीक्षा के लिए यहां समान रूप से काम करेगा
 – 
arunized
21 अप्रैल 2021, 16:15
यह वास्तव में कुछ भी नहीं बदलता है। आप अब भी लौटे Stream की सदस्यता ले सकते हैं और जो चाहें कर सकते हैं। मैं भाषा भ्रमण में स्ट्रीम के बारे में अधिक पढ़ने की अनुशंसा कर सकता हूं: dart.dev/guides/ भाषा/भाषा-दौरे#हैंडलिंग-स्ट्रीम
 – 
julemand101
21 अप्रैल 2021, 16:30