это асинхронное поведение? - PullRequest
0 голосов
/ 09 июля 2020

Почему программа ниже не выводит "вау", это асинхронное поведение дротика? что я упустил в этом фрагменте кода?

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:pedantic/pedantic.dart';

bool _asking = false;
String name = '';
Future main() async {
 askUserName();
}

Future askUserName() async {
  _asking = true;
  //feedInfoToTheUser({'info': 'enter a name'});
  //print('enter the name');
 Future.doWhile(() {
    if (name.isNotEmpty) {
      _asking = false;
      print('thank you');
      exit(0);
    }
    return _asking;
  });
  print('wow');
}

1 Ответ

1 голос
/ 09 июля 2020

Ваш код работает не так, как ожидалось, потому что метод, который вы даете doWhile, не возвращает никаких Future и поэтому может выполняться синхронно, что и будет.

Вы можете изменить код на следующий:

import 'dart:async';
import 'dart:convert';
import 'dart:io';

import 'package:pedantic/pedantic.dart';

bool _asking = false;
String name = '';
Future main() async {
  unawaited(askUserName());
}

Future askUserName() async {
  _asking = true;
  //feedInfoToTheUser({'info': 'enter a name'});
  //print('enter the name');
  unawaited(Future.doWhile(() {
    if (name.isNotEmpty) {
      _asking = false;
      print('thank you');
      exit(0);
    }
    return Future.value(_asking);
  }));
  print('wow');
}

Здесь мы возвращаем Future.value(_asking), которое является Future, которое будет оцениваться как другое событие в очереди событий, что делает метод doWhile await для этой оценки. Это делает так, что записывается wow.

Но у вас все еще есть бесконечное l oop (поэтому загрузка ЦП высока). Но теперь это бесконечное l oop в очереди событий, которое позволяет выполнять другие вещи в очереди событий между каждым событием.

...