Состояние гонки с прослушиванием потока - PullRequest
1 голос
/ 18 апреля 2020

У меня есть функция asyn c, как показано ниже. Однако содержимое возвращается нулевым задолго до завершения прослушивания потока.

Я начал играть с Future.delayed, но подумал об этом и хотел спросить, есть ли лучший подход, чтобы убедиться, что это asyn c?

import 'package:googleapis/drive/v3.dart' as ga;

static Future<String> getContentsFromFile() async {
String content;

ga.Media mediaResponse = await drive.files.get(fileId);

mediaResponse.stream.listen((data) {
    print("DataReceived: "+data);
    content = data
  }, onDone: () async {
    print("Task Done");
  }, onError: (error) {
    print("Some Error");
  });
return content;
}

Я звоню функция такая ..

String content = await getContentsFromFile();

1 Ответ

2 голосов
/ 18 апреля 2020

РЕДАКТИРОВАТЬ : Сделан пример более полным, с обработкой ошибок и частичного содержимого.

Вы можете использовать Завершитель для этого вида потока управления:

import 'dart:async';
import 'package:googleapis/drive/v3.dart' as ga;

static Future<String> getContentsFromFile() async {
  Completer<String> completer = Completer();
  String content = "";

  ga.Media mediaResponse = await drive.files.get(fileId);

  mediaResponse.stream.listen((data) {
    print("DataReceived: "+data);
    content += data;
  }, onDone: () async {
    print("Task Done");
    completer.complete(content);
  }, onError: (error) {
    print("Some Error");
    completer.completeError(error);
  });

  return completer.future;
}
...