我有两个功能
callee() async {
// do something that takes some time
}
caller () async {
await callee();
}
在这种情况下,caller()
等待callee()
完成。我不想要那个。我想在调用caller()
后立即完成callee()
。 callee()
可以在将来完成,我不在乎。我只是想像一个线程一样启动它然后忘掉它。
这可能吗?
答案 0 :(得分:7)
当您调用callee
函数时,它会返回Future
。然后await
等待未来完成。如果你没有等待将来,它最终会完成,但你的caller
函数在等待时不会被阻止。所以,你可以这样做:
caller() {
callee(); // Ignore returned Future (at your own peril).
}
如果您这样做,您应该知道如果callee
因错误而失败会发生什么。这将使返回的未来完成该错误,如果您不聆听未来,则该错误被视为“未被捕获”。未捕获的错误由当前Zone
处理,默认行为是顶级未捕获错误,可能会导致您的隔离。
所以,记得处理错误。
如果callee
不能失败,那很好,你已经完成了(除非它无论如何都会失败,那么你会很乐意调试它)。
您可以在本地处理错误:
caller() {
callee().catchError((e, s) {
logErrorSomehow(e, s);
});
}
或者您可以安装错误处理区域并运行以下代码:
runZoned(() {
myProgram();
}, onError: logErrorSomehow);
请参阅runZoned函数及其onError
参数。
答案 1 :(得分:4)
当然,只需省略await
。这样就可以立即调用callee()
,并且当调用异步操作时,将在事件队列中调度该调用以便稍后执行,之后会立即继续caller()
。
这不像是一个主题。如上所述,处理被排入事件队列,这意味着在当前任务和所有先前排队的任务完成之前,它不会被执行。
如果你想要真正的并行执行,你需要利用隔离。
另见