我有两个功能
callee() async {
// do something that takes some time
}
caller () async {
await callee();
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,caller()
等待直到callee()
完成.我不希望这样.我想caller()
在调用后立即完成callee()
.callee()
可以在将来完成,我不在乎.我只是想像一个线程一样启动它然后忘记它.
这可能吗?
当你调用该callee
函数时,它返回一个Future
.在await
随后等待未来完成.如果你没有等待将来,它最终会完成,但你的caller
功能不会在等待时被阻止.所以,你可以这样做:
caller() {
callee(); // Ignore returned Future (at your own peril).
}
Run Code Online (Sandbox Code Playgroud)
如果你这样做,你应该知道如果callee
失败并出现错误会发生什么.这将使返回的未来完成该错误,如果您不聆听未来,则该错误被视为"未被捕获".未捕获的错误由当前处理,Zone
默认行为是顶级未捕获错误,可能会导致您的隔离.
所以,记得处理错误.
如果callee
不能失败,那很好,你已经完成了(除非它失败了,那么你将有乐趣调试).
您可以在本地处理错误:
caller() {
callee().catchError((e, s) {
logErrorSomehow(e, s);
});
}
Run Code Online (Sandbox Code Playgroud)
或者您可以安装错误处理区域并运行您的代码:
runZoned(() {
myProgram();
}, onError: logErrorSomehow);
Run Code Online (Sandbox Code Playgroud)
请参阅runZoned函数及其onError
参数.
当然,请忽略await
。这种方法callee()
将立即被调用,并且在调用异步操作时,将在事件队列中安排该调用以供以后执行,caller()
此后立即继续进行。
虽然这不像一个线程。如前所述,处理被排队到事件队列中,这意味着直到当前任务和所有先前排队的任务完成后才执行。
如果要真正的并行执行,则需要使用隔离。
也可以看看
归档时间: |
|
查看次数: |
931 次 |
最近记录: |