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

时间:2016-05-31 17:13:29

标签: dart async-await

我有两个功能

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

caller () async {
  await callee();
}

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

这可能吗?

2 个答案:

答案 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()

这不像是一个主题。如上所述,处理被排入事件队列,这意味着在当前任务和所有先前排队的任务完成之前,它不会被执行。

如果你想要真正的并行执行,你需要利用隔离。

另见