dart - 在 Dart 中调用异步函数而不等待,例如启动一个线程

标签 dart async-await

我有两个功能

callee() async {
  // do something that takes some time
} 

caller () async {
  await callee();
}

在这种情况下,caller()等到callee()完成。我不想要那个。我要caller()在调用 callee() 后立即完成. callee()以后什么时候都能完成,我不在乎。我只想像线程一样启动它,然后忘记它。

这可能吗?

最佳答案

当您调用callee函数,它返回一个 Future . await然后等待那个 future 完成。如果你不等待 future ,它最终还是会完成,但是你的 caller功能不会在等待时被阻塞。所以,你可以这样做:

caller() {
  callee();  // Ignore returned Future (at your own peril).
}
如果你这样做,你应该知道如果 callee 会发生什么。失败并出现错误。这将使返回的 future 完成该错误,如果您不听 future ,该错误将被视为“未捕获”。当前 Zone 处理 Uncaught Error 并且默认行为是表现得像一个顶级 Uncaught Error ,这可能会杀死你的隔离。
所以,记得处理错误。
如果 callee不能失败,太好了,你已经完成了(除非它无论如何都失败了,那么你会很开心调试它)。
实际上,由于忘记等待 future 的风险,强烈推荐 unawaited_futures lint要求你不只是忽略返回的 future ,而是希望你做 unawaited(callee());表示这是故意的。 (unawaited 函数可以从 package:meta 导入,并且可以从 SDK 版本 2.14 的 dart:async 库中获得)。unawaited函数虽然不处理错误,所以如果你可能有错误,你应该做更多的事情。
您可以在本地处理错误:
caller() { 
  callee().catchError((e, s) { 
    logErrorSomehow(e, s); 
  }); 
}
(由于 null 安全,此代码仅在 callee() future 具有可空值类型时才有效。从 Dart 2.14 开始,您将能够使用 callee().ignore() 代替,在此之前您可以使用 callee().then((_) => null, onError: (e, s) => logErrorSomehow(e, s)); 代替。)
或者您可以安装一个错误处理区域并在其中运行您的代码:
runZoned(() {
  myProgram();
}, onError: logErrorSomehow);
runZoned函数是onError范围。

关于dart - 在 Dart 中调用异步函数而不等待,例如启动一个线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37551843/

相关文章:

flutter - 颤音短信功能在构建APK时不起作用

javascript - 在任何地方使用异步函数的(潜在)缺点是什么?

javascript - 异步等待 + Gulp - GulpUglifyError : unable to minify JavaScript?

flutter - 使用过期软件包的Flutter不会让我运行我的应用程序

firebase - 将FirebaseUser映射到自定义User对象

http - 使用CORS从Dart应用程序发布到laravel 4 API时出错

rust - 如何在 Rust 中以异步方式运行另一个函数?

c# - 为什么 LogicalCallContext 不适用于异步?

java - 根据邻居的值更新多线程单元。如何继续使用 CyclicBarrier?

firebase - 当我想获取我的图片下载链接 Flutter 时遇到问题(请求没有应用检查 token 。)