在Dart中调用异步函数而不等待,就像启动一个线程一样

Gaz*_*kus 4 async-await dart

我有两个功能

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

caller () async {
  await callee();
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,caller()等待直到callee()完成.我不希望这样.我想caller()在调用后立即完成callee().callee()可以在将来完成,我不在乎.我只是想像一个线程一样启动它然后忘记它.

这可能吗?

lrn*_*lrn 8

当你调用该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参数.


Gün*_*uer 5

当然,请忽略await。这种方法callee()将立即被调用,并且在调用异步操作时,将在事件队列中安排该调用以供以后执行,caller()此后立即继续进行。

虽然这不像一个线程。如前所述,处理被排队到事件队列中,这意味着直到当前任务和所有先前排队的任务完成后才执行。

如果要真正的并行执行,则需要使用隔离。

也可以看看