如何对包含异步的函数返回的值使用 List.sort?

2023-12-06

我有这个代码:

 widget.items.sort((a, b) {

           await getItemDistance(a, true);
          await getItemDistance(b, false);

          return (itemADistance)
              .compareTo(itemBDistance);
        });

我正在尝试根据 getItemDistance 返回的值对 widget.items 列表进行排序。但是我收到一条红色波浪线的错误,上面写着:

wait 表达式只能在异步函数中使用

当我尝试将异步添加到排序方法时,我得到另一条红色波浪线,上面写着:

无法分配参数类型“Future Function(Item, Item)” 参数类型“int Function(Item, Item)”

我该如何解决这个困境呢? :) 谢谢


List.sort是一个需要同步回调的同步函数;无法将其与异步回调一起使用。我建议改变你的List并进行任何必要的异步工作first and then同步对结果进行排序。这样做也应该避免打电话getItemDistance(由于是异步的,这可能会很昂贵)同一项目多次。例如,类似:

final computedDistances = <Item, double>{};
for (final item in widget.items) {
  final distance = await getItemDistance(item, ...);
  computedDistances[item] = distance;
}

widget.items.sort((a, b) => 
  computedDistances[a].compareTo(computedDistances[b])
);

(I don't know what the second argument to getItemDistance represents; if you can't get around that, you would need to build one Map with getItemDistance(..., true) results and one with getItemDistance(..., false) results1.)

作为最后的手段,您可以编写自己的异步排序函数。


Edit #1

这应该是一个更有效的版本,因为它不会一一等待每个异步操作:

final computedDistances = await Future.wait<double>([
  for (final item in widget.items) getItemDistance(item, ...),
]);

final computedDistancesMap = <Item, double>{
  for (var i = 0; i < widget.items.length; i += 1)
    widget.items[i]: computedDistances[i],
};

widget.items.sort((a, b) => 
  computedDistancesMap[a].compareTo(computedDistancesMap[b])
);

Edit #2

我添加了一个List.sortWithAsyncKey扩展方法 to package:dartbag可以做到这一点:

await widget.items.sortWithAsyncKey(
  (element) => getItemDistance(element, ...),
);

1 However, if you need to call getItemDistance(..., true) for the first argument and getItemDistance(..., false) for the second argument, that implies that your comparison function probably is not self-consistent.

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

如何对包含异步的函数返回的值使用 List.sort? 的相关文章

随机推荐

  • 安装 .NET Core RTM 后缺少 Microsoft.DotNet.Web.targets

    我们正在将您的项目迁移到 NET Core 我正在按照本页上提供的步骤升级您的构建服务器https www microsoft com net core windows 安装 VS 2015 update 3 和 DotNetCore 1
  • 如何自动化 hg bisect --extend 以遵循共同祖先?

    通常 在一个hg bisect c my command 我收到通知说我应该跑步hg bisect extend
  • 抓取Facebook生活事件

    我一直在寻找一种方法从图形 API 中提取朋友最近的生活事件 但我遇到了位置拦截器 我知道你可以向朋友查询他们的位置 但是是否有可能找到以前的位置历史记录 或者只是一般历史记录 如果某人在工作中获得晋升 因此他们改变了角色 请原谅缺少代码
  • 在 C++ 中使用回调会增加耦合吗? [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 Q1 为什么使用回调函数 Q2 回调是邪恶的吗 对那些人来说很有趣 谁知道 对其他人来说是一场噩梦 Q3 除了回调还有其他选择吗 回调减少了耦合 被调用方被传递了一些指针 但它不
  • Rails 在多个实例/服务器上重新加载动态路由

    我们如何强制 Rails 在多个服务器 实例上重新加载路由 我们在 Google App Engine 中拥有一个在 5 个以上实例上运行的多租户平台 我们希望所有站点都能从后端定义自己的一组路由 每当我们有一个新站点时 我们目前都必须重新
  • Android canvas - 画一个洞

    在Android中用canvas可以实现如下图吗 我想要一个洞 而不仅仅是在黄色的红色层上有一个圆圈 我用我的以下代码尝试了这个 但失败了 onDraw Method canvas drawBitmap yellow 0 0 paint c
  • 为什么EF Core没有设置自定义注解?

    在 DbContext 中我声明模型如下 modelBuilder Entity
  • SQL Server XACT_ABORT 排除

    我有一个更大的存储过程 它利用多个 TRY CATCH 块来捕获并记录各个错误 我还在过程的整个内容周围封装了一个事务 以便能够在沿途某个地方发生错误时回滚整个过程 以防止大量混乱的清理 XACT ABORT 已启用 否则它不会回滚整个事务
  • 将字符串分割成一定大小的块

    假设我有一个字符串 string str 1111222233334444 我怎样才能把这个字符串分成一定大小的块 例如 将其分解为 4 的大小将返回字符串 1111 2222 3333 4444 static IEnumerable
  • React-Table 的导入问题

    我正在使用react table库在react中创建一个表 几天前 我使用同一个库创建了一个表 没有遇到任何问题 但今天我收到以下错误 尝试导入错误 react table 不包含默认导出 导入为 ReactTable 进口声明 从 反应表
  • C# 中带有布尔条件的三元

    如果我要编写这段代码 它可以与正常的 if else 布局一起正常工作 if isOn i 10 else i 20 虽然我不确定如何使用三元运算符进行转换 isOn true i 1 i 0 错误 无法确定条件表达式的类型 因为 void
  • 如何覆盖默认的 Liferay 登录身份验证?

    我正在使用 Liferay 6 1 我想覆盖默认的 Liferay 登录身份验证并希望设置我的自定义身份验证 到目前为止 我所做的是 我创建了一个钩子插件 并在 Portal properties 文件中设置了以下属性 auth pipel
  • 将 MSBuild PublishProfile 与 Visual Studio 2012 结合使用时,MSDeploy 跳过规则

    我正在尝试使用 WebDeploy 通过自定义 MSDeploy 跳过规则和 Visual Studio 2012 中保存的发布配置文件来发布网站 我可以从命令行使用发布配置文件 但跳过删除文件夹的跳过规则不起作用 我有一个ErrorLog
  • 具有相同密钥的多个条目:24.0.0 rc4=24.0.0 rc4

    将 Android Studio 升级到 2 2 3 后 显示错误 IllegalArgumentException 具有相同密钥的多个条目 24 0 0 rc4 24 0 0 rc4 和 24 0 0 rc4 24 0 0 rc4 最近更
  • 从 VS Code 在终端中运行文件

    是否有任何 VS Code 快捷方式可以让您在 Windows 终端中运行文件 而无需将文件的路径直接写入终端 提前致谢 Try key ctrl shift t command workbench action terminal send
  • 内联汇编的“现实”用途有哪些? [复制]

    这个问题在这里已经有答案了 有什么是我们可以在汇编中做但在原始 C 中不能做的吗 或者有什么在组装中更容易做的事情吗 是否有任何现代代码实际上是使用内联汇编编写的 或者它只是作为遗留或教育功能实现 内联汇编 以及相关说明 调用纯粹用汇编语言
  • Eclipse ADT Bundle 在 Mint 16 Petra 上突然崩溃

    我最近在我的笔记本电脑 四核 8 GB 内存 上安装了 Linux Mint 16 Petra Cinnamon 64 位 我下载了适用于 Linux 64 位 的 ADT Bundle 当我开始使用 Eclipse 在 Android 中
  • 用于跟踪 Visual Studio 中项目的总工作时间的附加组件

    VS2010 是否有一个扩展可以跟踪项目上花费的总时间 因此 开发人员可以看到他为特定解决方案的开发贡献了多少时间 None
  • 在 Jinja2 中合并多个列表

    有没有办法在 Jinja2 的列表中组合多个列表 例如 如果我有 foo moo py jinga template example stack overflow 我期望得到 foo moo py jinga template exampl
  • 如何对包含异步的函数返回的值使用 List.sort?

    我有这个代码 widget items sort a b await getItemDistance a true await getItemDistance b false return itemADistance compareTo i