我有两个功能
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/