我有一个谷歌Map的应用程序,在每个缩放变化或Map边界的变化,我做了一个调用的后端,以获得点的边界。我们有一个很大的数据库,大约有300万条记录,所以NodeJS后端需要一些时间和资源来使用过滤器和集群化来查询它们。
如果用户来回他生成吨的查询,所以我写了一个脚本,中止前一个查询,如果我们做一个新的
import React, { useState, useRef } from 'react'
const controllerRef = useRef()
const getAddresses = useCallback(async (body) => {
setLoading(true)
if (controllerRef.current) controllerRef.current.abort()
const controller = new AbortController()
controllerRef.current = controller
const signal = controllerRef.current?.signal
try {
const { clusters } = await request(`/api/address/`, 'POST', body, {
Authorization: `Bearer ${token}`
}, signal)
controllerRef.current = null
setLoading(false)
} catch (e) {
console.log('Error :>> ', e);
}
}, [token, request])
问题是-后端发生了什么?每个查询是否仍然由NodeJS计算,或者它也会因为客户端断开连接而中止?
如果有帮助的话,我们正在使用MySQL和sequelize。如果我中止前端查询,MySQL查询是否也会中止?
我在想,也许我不仅需要取消前端的查询,还需要进行另一个查询,标记NodeJS以取消计算。
主要是优化后端加载,因为每个查询都很重。
2条答案
按热度按时间kq0g1dla1#
回答你的问题,不,这是不可能的,特别是如果你的后端已经查询了你的SQL服务器。
在你的情况下,老实说,我会把大部分的工作在前端,你知道的概念去抖动和节流?
yi0zb3m42#
我最近遇到了一个类似的问题,从那以后我就对这个主题很感兴趣。我目前有一个奇怪的,可能是低效的解决方案。基本上,您必须使用全局值,例如会话变量或存储在DB中的值。然后,在服务器端执行指令(搜索、更新等)期间,将同时触发循环,其中,在每次迭代中,将验证我们的全局值是否已更改。该全局值可以是1以继续,0以结束循环(和脚本执行)。
然后,在客户端侧,可以触发第二请求以取消第一请求,为此,将向服务器侧的另一个文件发出请求,其中全局值将从1改变为0,以这样的方式,当在第一文件的循环中验证全局值不再是1而是0时,将结束正在执行的整个执行。
最后,全局值将被重置为1,这将是允许执行未来请求的初始值。
这就是我所思考和尝试的。这不是一个优雅或有效的解决方案,但我还没有找到另一种方法来处理完全取消请求,无论是在客户端还是服务器端。