我在 Mac 服务器上使用 Vapor。服务器进行冗长的计算,因此我需要允许客户端能够取消计算。
在客户端,我有以下 Javascript 代码来发送 POST 请求并等待结果:
async function doSomething(text) {
controller = new AbortController()
const response = await fetch("http://" + website + "/api/dosomething",
{
method: 'POST',
signal: controller.signal,
headers: {
'Accept': 'application/json',
'Content-Type': 'application/json'
},
body: JSON.stringify({ text: text })
})
const results = await response.json()
return results
}
以及取消该过程的按钮:
async function cancelquery() {
controller.abort()
}
这在客户端工作得很好,即当我单击“取消”按钮时客户端不再等待结果。但是,我不知道如何捕获服务器端的“中止”信号以停止计算。 Vapor 中是否有任何外部变量、方法或事件可以用来知道客户端发送了中止信号?
我会研究将您的“获取”提交到
eventLoop
或promise
,但通过将指向它的指针存储在应用程序配置密钥的字典中并将密钥传递回您的客户端来跟踪它。然后,您可以创建一个“取消”路由,该路由使用该键来检索此事件循环并在其上调用 close()
。
我还没有尝试过这样做,但这似乎是一个合理的起点。请参阅此处。您可以通过添加
whenComplete
处理程序来删除字典中的条目来允许正常终止。