我有两个功能
callee() async {
  // do something that takes some time
} 
caller () async {
  await callee();
}在这个场景中,caller()一直等到callee()完成。我不想这样。我希望caller()在调用callee()之后立即完成。callee()可以在将来的任何时候完成,我不在乎。我只想像一根线一样开始,然后忘记它。
这个是可能的吗?
发布于 2016-05-31 17:36:45
调用callee函数时,它将返回一个Future。然后,await将等待这个未来的完成。如果您不等待未来,它最终还是会完成,但是您的caller函数在等待时不会被阻塞。所以,你可以这么做:
caller() {
  callee();  // Ignore returned Future (at your own peril).
}如果您这样做,您应该知道如果callee失败时会发生什么错误。这将使返回的未来完成与该错误,如果您不听取未来,该错误被认为是“秘密”。未明错误由当前的Zone来处理,默认的行为就像一个顶级的未明错误,这可能会杀死您的隔离。
所以,请记住处理错误。
如果callee不能失败,太好了,您已经完成了(除非它无论如何都失败了,那么您会很高兴地调试它)。
实际上,由于忘记等待未来的风险,高度调整的皮棉要求您不只是忽略返回的未来,而是希望您执行unawaited(callee());来表示它是故意的。( unawaited函数可以从package:meta导入,可以从SDK2.14版本的dart:async库中获得)。但是,unawaited函数不处理错误,所以如果您可能有错误,那么您应该做更多的事情。
您可以在本地处理错误:
caller() { 
  callee().catchError((e, s) { 
    logErrorSomehow(e, s); 
  }); 
}(由于null安全性,此代码仅在callee()未来具有可空值类型时才能工作。从Dart 2.14开始,您将能够使用callee().ignore(),在此之前您可以使用callee().then((_) => null, onError: (e, s) => logErrorSomehow(e, s));。)
或者,您可以安装一个错误处理区域并在以下代码中运行代码:
runZoned(() {
  myProgram();
}, onError: logErrorSomehow);请参见runZoned函数及其onError参数。
发布于 2016-05-31 17:18:22
当然,只是省略了await。通过这种方式,将立即调用callee(),并在调用异步操作时,将调用调度到事件队列中,以便稍后执行,然后继续执行caller()。
不过,这可不像一条线。如前所述,处理将排队到事件队列,这意味着在当前任务和所有以前排队的任务完成之前不会执行它。
如果您想要真正的并行执行,您需要利用隔离。
另请参阅
https://stackoverflow.com/questions/37551843
复制相似问题