Dart 怎么取消Future

本文介绍如何在Dart中将Future转换为Stream,以实现在数据未到达前取消请求,确保只处理最新的数据请求。通过重写getData()方法返回Stream,并利用asStream()方法监听Future结果,可在用户导航离开时取消订阅,避免处理过期数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dart汇总请点击这里

问题

假设调用了REST服务,当该服务返回数据时,Future将完成,显示也会随之更新。这种情况可能类似于以下情况:

main() async {
  List data = await getData();
  updateDisplay(data);
}

Future<List> getData() async {
  // make the REST call
  Response restResponse = await HttpRequest.get(.....);
  
  // massage the data
  List data = restResponse.response.map((Map record) {
    // transform/check raw records
    // return good data
  });
  
  return data;
}

void updateDisplay(List data) {
  // update the display
}

如果该REST调用花费很长时间,如果您的用户变得不耐烦并且导航离开了首先需要数据的视图怎么办?

解决方案

很多人都知道,无法取消Dart中的Future,但是可以取消Stream的订阅。因此,处理这种情况的一种方法是重写getData()以返回Stream。

幸运的是,可以轻松地从调用方将Future转换为Stream:

void main() {
  // keep a reference to your stream subscription
  StreamSubscription<List> dataSub;
  
  // convert the Future returned by getData() into a Stream
  dataSub = getData().asStream().listen((List data) {
    updateDisplay(data);
  });

  // user navigated away!
  dataSub.cancel();
}

使用Future的asStream()方法,基本上可以将Future当作一个Stream来listen。这样,如果发现不再需要尚未到达的数据,则可以保存您的订阅并使用它取消回调。所有这些都无需修改getData()功能。

真正发生了什么

实际上不可能阻止Future的完成。
所能做的就是在特定情况下(例如,响应在返回之前变得无关紧要)停止执行回调。
在代码示例中,dataSub.cancel()在Future完成之前调用即可实现此目的。

使用此方法的更实际的应用场景:

// keep a reference to your stream subscription
StreamSubscription<List> dataSub;

void onGetDataClicked() {
  // make sure any still-pending prior request never gets processed
  dataSub?.cancel();
  
  // convert the Future returned by getData() into a Stream
  dataSub = getData().asStream().listen((List data) {
    updateDisplay(data);
  });
}

通过此流程,可以确保只有最新的数据请求最终显示。

### STM32开发环境在Mac操作系统的设置 #### 安装必要的工具链和支持软件 对于Mac操作系统而言,除了常见的STM32CubeMX和IDE的选择外,还需要特别关注Homebrew以及OpenOCD的安装[^1]。 - **Homebrew**: Homebrew是OS X下的包管理器,利用它能够方便快捷地安装各种命令行工具。通过终端执行`/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"`来完成安装。 - **OpenOCD**: Open On-Chip Debugger (OpenOCD) 是一个用于调试、编程闪存芯片和其他非易失性存储设备的应用程序。可以通过Homebrew轻松获取此工具,在终端输入`brew install openocd`即可完成安装。 #### 配置STM32CubeMX 尽管主要界面功能跨平台一致,但在Mac上启动STM32CubeMX可能需要额外注意Java版本兼容性问题。确保已安装适合当前系统的JRE/JDK版本,并将其路径正确配置给应用程序使用。 #### IDE选择与配置 针对Clion作为集成开发环境的情况: - 打开CLion后进入Preferences -> Build, Execution, Deployment -> Toolchains 添加新的MinGW或GCC Arm Embedded编译器路径; - 对于CMakeLists.txt文件中的toolchain设定部分,需指定正确的交叉编译前缀名,例如arm-none-eabi-gcc等; - 如果采用STLink V2接口进行烧录,则可以在上述基础上进一步配置OpenOCD连接参数以便实现在线调试功能[^3]。 ```cmake set(CMAKE_SYSTEM_NAME Generic) set(CMAKE_SYSTEM_PROCESSOR arm) set(TOOLCHAIN_PREFIX "arm-none-eabi") set(CMAKE_C_COMPILER ${TOOLCHAIN_PREFIX}-gcc) set(CMAKE_ASM_COMPILER ${TOOLCHAIN_PREFIX}-as) set(CMAKE_OBJCOPY ${TOOLCHAIN_PREFIX}-objcopy CACHE INTERNAL "") set(CMAKE_SIZE_UTIL ${TOOLCHAIN_PREFIX}-size CACHE INTERNAL "") set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值