【问题标题】:Race condition with stream listen流式侦听的竞争条件
【发布时间】:2020-04-18 00:33:01
【问题描述】:

我有一个如下所示的异步函数。但是,在流侦听完成之前,内容将返回 null。

我开始玩 Future.delayed,但想得更好,想问是否有更好的方法来确保它是异步的?

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();

【问题讨论】:

  • 您正在收听的流是什么?
  • 一个谷歌驱动文件(媒体),它应该是 media.stream.listen

标签: flutter dart stream


【解决方案1】:

编辑:使示例更完整,处理错误和部分内容。

您可以将Completer 用于此类控制流:

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;
}

【讨论】:

    猜你喜欢
    • 2018-09-27
    • 2022-01-23
    • 2021-03-20
    • 1970-01-01
    • 2018-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多