向等待函数添加超时的最佳方法是什么?
Example:
/// lets pretend this is in a library that I'm using and I can't mess with the guts of this thing
func fetchSomething() async -> Thing? {
// fetches something
}
// if fetchSomething() never returns then doSomethingElse() is never ran. Is there anyway to add a timeout to this system?
let thing = await fetchSomething()
doSomethingElse()
我想让系统在fetchSomething()不返回的情况下更加健壮。如果使用合并,我会使用timeout操作符。
2条答案
按热度按时间e4yzc0pl1#
我们可以创建一个
Task
,如果它在一段时间内没有完成,则再创建一个cancel
。例如,并行启动两个任务:如果
fetchTask
先完成,它将到达timeoutTask.cancel
并停止它。如果timeoutTask
先完成,它将取消fetchTask
。显然,这取决于
fetchTask
的实现。它不仅应该检测取消,而且如果取消了,还应该抛出一个错误(可能是CancellationError
)。没有关于fetchTask
实现的细节,我们无法进一步评论。例如,在上面的示例中,我将返回
Thing
,而不是返回可选的Thing?
,但如果取消了它,则会返回throw
错误。我不想提它,但是尽管上面假设
fetchSomething
是行为良好的(即,可取消的),但是即使它不起作用,模式上也有工作的排列(即,在一些合理的时间表中运行doSomethingElse
,即使fetchSomething
“永远不会返回”)。但是这是一个固有的不稳定的情况,因为
fetchSomething
使用的资源在它完成之前是无法恢复的。Swift不提供抢先取消,所以虽然我们可以很容易地解决确保doSomethingElse
最终运行的战术问题,但是如果fetchSomething
可能永远不会在某个合理的时间表内完成,那么你就有更深层次的问题了。您确实应该找到一个可取消得
fetchSomething
副本(如果还没有得话).mwg9r5ms2#
//您可以使用'try and catch'。等候try区块内的撷取数据。当撷取失败时,catch区块可以执行不同的陈述式。例如: