英文:
How to handle canceled request in vapor?
问题
我正在使用Vapor在一台Mac服务器上。服务器执行了长时间的计算,因此我需要允许客户端能够取消这个计算。
在客户端,我有以下的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()
}
这在客户端上运行得很好,也就是说,当我点击取消按钮时,客户端不再等待结果。然而,我不知道如何在服务器端捕获“abort”信号以停止计算。在Vapor中是否有任何外部变量、方法或事件,我可以用来知道客户端发送了一个中止信号?
英文:
I am using Vapor on a mac server. The server makes lengthy computation so I need to allow the client to be able to cancel the computation.
On the client side, I have the following Javascript code to send a POST request and wait for the result:
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
}
as well as a button to cancel the process:
async function cancelquery() {
controller.abort()
}
This works fine on the client side, i.e., the client does no longer wait for the result when I click the Cancel button. However, I don't know how to catch the "abort" signal on the server side to stop the computation. Is there any external variable, method or event in Vapor that I could use to know that the client sent an Abort signal?
答案1
得分: 1
这绝对与服务器端无关,因为服务器不知道客户端是否仍在等待响应。
https://stackoverflow.com/questions/7506413/aborting-an-http-request-server-side-advantage
这里有一个类似的问题,但与Vapor不完全相关。
英文:
It is absolutely not related to server-side since server doesn't know if client still waiting for the response or not.
https://stackoverflow.com/questions/7506413/aborting-an-http-request-server-side-advantage
Here's similar question but not related to exactly Vapor.
答案2
得分: 1
我会调查将您的 'fetch' 提交到一个 eventLoop
或 promise
,但通过在应用配置键上存储一个指向它的指针来跟踪它,并将一个键传回给客户端。然后,您可以创建一个 'cancel' 路由,该路由使用该键检索此事件循环并调用 close()
。
我没有尝试过这样做,但这似乎是一个合理的起点。请参见此处。您可以通过添加一个 whenComplete
处理程序来允许正常终止以删除字典中的条目。
英文:
I would investigate submitting your 'fetch' to an eventLoop
or promise
, but keeping track of it by storing a pointer to it in a dictionary on an App Config Key and passing a key back to your client. You can then create a 'cancel' route that uses the key to retrieve this event loop and invokes close()
on it.
I haven't played with doing this, but it seems a reasonable place to start. See here. You can allow for normal termination by adding a whenComplete
handler to remove the entry in your dictionary.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论