从异步方法返回多个结果?

2023-11-29

我目前有一个看起来像这样的方法:

typedef void MyCallback(int status, String body);


void makeRequest(String url, MyCallback callback) async {
  if( someCondition ){
    callback(1, '');
  }

  Response response = await http.get(url);

  if( response.httpCode == 200 ){
    callback(2, response.body);
  }
  else{
    callback(3, '');
  }
}

我想摆脱回调,以便我可以等待结果makeRequest。但如果我只是让它返回Future,我最多只能回来一次。

我研究过使用流,但似乎有点复杂。所以基本上我正在寻找像Future但这可能会收到“部分结果”,即多次收到结果。为了显示:

MultiFuture<int> makeRequest(String url){
  MultiFuture result = new MultiFuture();

  if( someCondition ){
    result.value(1);
  }

  http.get(url).then((response){
    if( response.httpCode == 200 ){
      result.value(2);
    }
    else{
      result.value(3);
    }

    result.finish();
  });


  return result;
}




MultiFuture requestResult = makeRequest('https://example.com');

await requestResult.onValue((int value){
  print('value: $value');
});      
// When result.finish() is called, the await is finished

使用流是我最好的选择,还是有某种MultiFuture我只是不知道?


从异步方法返回多个结果正是流的作用。这是我根据您的代码制作的示例,以便您更容易理解其工作原理:

class MultiFuture {
  StreamController<int> _resultController = StreamController<int>();
  Stream<int> get requestResult => _resultController.stream;

  void makeRequest(String request) async {
    if (true) {
      _resultController.sink.add(1);
    }

    // mock request
    await Future.delayed(Duration(seconds: 3));

    if (true) {
      _resultController.sink.add(2);
    } else {
      _resultController.sink.add(3);
    }
  }

  void example() {
    makeRequest("https://example.com");

    requestResult.listen((value) {
      print('value: $value');
    });
  }
}

您可以调用 MultiFuture().example(); 来测试它


但我建议您观看这些简单的短片以获得更好的想法:使用 Dart 进行异步编码

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从异步方法返回多个结果? 的相关文章

随机推荐

  • 如何在我的 Android 应用程序中使用 ScreenShotClient

    我正在开发一个应用程序 可以帮助用户捕获 Android 屏幕截图 Android 4 x 我知道 android ICS 上的帧缓冲区已损坏 我听说我们可以使用 ScreenShotClient 来执行此操作 如下所示 Screensho
  • 带下拉列表的 Laravel 5.2 过滤器

    我想做下拉列表过滤 我有一个网页 显示了一些带有标题和类别的帖子 该页面有一个下拉菜单nav blade php 我从类别表动态生成下拉列表 但是 当我选择下拉菜单中的一项 例如类别名称 时 我希望页面仅显示该类别的帖子 我还创建了类别和帖
  • 简单的 istream_iterator 问题

    我是 C 新手 如果这是一个愚蠢的问题 我很抱歉 我似乎无法弄清楚为什么这不起作用 它复制到第一个向量中 并且似乎跳过第二个复制调用 include
  • 在通过 $sce.trustAsHtml 添加的字符串中绑定 Angular js 中的数据

    我正在为遗留系统实现一个网络界面 因此来自服务器的数据是固定的 该服务器数据指定要向用户显示的各种控件 例如组合框 按钮等 我已经解析了服务器数据并通过 sce trustAsHtml 添加了控件的 HTML 问题是控件没有绑定到模型 如果
  • 如何动态获取文本框中datagridview列的总和

    我想获得 datagridview 列的总和并将其显示在文本框中 每次输入后 总和应动态更改 为此 我使用文本框的 textChanged 事件 但是当输入内容时 它不会显示任何结果 我想在文本框中动态获取结果 我想避免使用求和按钮 下面是
  • 导出android库项目以供重用,无需源代码

    出于安全原因 我需要导出没有源代码的库项目 不幸的是 库项目中生成的 jar 文件不包含资源 我不能指望这个图书馆的用户能够处理图书馆所需的任何资源 已经有类似的帖子了 但我还没有看到解决方案 以下食谱曾经有效 尽管我最近没有尝试过 步骤
  • Java 进程 - 无法解压缩 zip 文件

    我正在尝试解压缩一些 zip 文件 它大约有 65 兆 代码片段如下 这个方法实际上解压一个文件 public synchronized void execute Path zipFile final ProcessBuilder buil
  • 动态创建匿名类型? [复制]

    这个问题在这里已经有答案了 我想创建一个可以动态设置属性名称的匿名类型 它不必是匿名类型 我想要实现的就是动态设置任何对象属性名称 它可以是 ExpandoObject 但字典对我不起作用 您有什么建议 Only ExpandoObject
  • Python 3.2.2 open('C:\file.txt') 不起作用

    诚然 我是一个新手 但是 我认为 我按照教程所说的进行了操作 对于我安装的版本 但我无法让 Python 读取文件 其他人遇到过长文件名或路径的问题 但我让我的文件名或路径简短而甜蜜 所以我想 文件本身在一行中包含一个单词 print st
  • XSLT 中的词频计数器

    我正在尝试用 XSLT 制作一个词频计数器 我希望它使用停用词 我开始了迈克尔 凯的书 但我很难让停用词发挥作用 此代码适用于任何源 XML 文件
  • 为空数据框创建异常

    我正在接受用户输入来获取特定股票的历史数据 我想处理 2 个可能的错误 第一个是由于错误输入而生成的错误 并且代码生成错误 第二个是如果输入错误但代码被执行并且我得到一个空数据框 while True try us input Enter
  • 获取对 std::thread::_M_start_thread 的未定义引用

    我正在构建一个使用我从源代码构建的第三方库 Box2D MT 的应用程序 链接时 我收到此未定义的引用错误 b2Threading cpp text ZNSt6threadC2IM12b2ThreadPoolFviEJPS1 iEEEOT
  • 滚动 PCA 并绘制主成分的比例方差

    我使用以下代码来执行 PCA PCA lt prcomp Ret1 center TRUE scale TRUE summary PCA 我得到以下结果 Importance of components PC1 PC2 PC3 PC4 St
  • 替换函数内的异步加载

    我正在使用 Javascript 进行替换 我做了这样的事情 var replacedText originalText replace regex function value i return value some additional
  • 如何为具有 SRC、OBJ 和 BIN 子目录的 C 项目创建 Makefile?

    几个月前 我想出了以下通用的Makefile对于学校作业 Generic Makefile Author email protected Date 2010 11 05 Changelog 0 01 first version projec
  • Thymeleaf 嵌套迭代触发 org.thymeleaf.exceptions.TemplateInputException

    我正在尝试迭代对象列表并生成一个div class card deck every 4对象和嵌套div class card 对于每个对象 这是生成异常的代码line 234 UPDATE Note line 234中提到html并拥有由于
  • 如何在使用出站网关上传文件之前检查 aws s3 存储桶是否可用

    在 Spring Boot 应用程序中使用 aws s3 出站适配器 尝试上传 s3 存储桶中的文件 想在上传文件之前检查存储桶是否可用 如果存储桶不可用 则需要抛出错误 对此提出建议
  • 在 javascript (lodash) 中合并部分重复的数组

    我有一个很大的 javascript 数组 其中包含一些人在不同年份购买的汽车 简化后的数组是这样的 const owners name john hasCar true yearBought 2002 name john hasCar t
  • 具有多个已定义的入口点错误

    我有以下代码 namespace WpfApplication2
  • 从异步方法返回多个结果?

    我目前有一个看起来像这样的方法 typedef void MyCallback int status String body void makeRequest String url MyCallback callback async if