mysql 如果我在前端中止了一个fetch,后端的函数也会中止吗?

ss2ws0br  于 2023-06-28  发布在  Mysql
关注(0)|答案(2)|浏览(137)

我有一个谷歌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以取消计算。
主要是优化后端加载,因为每个查询都很重。

kq0g1dla

kq0g1dla1#

回答你的问题,不,这是不可能的,特别是如果你的后端已经查询了你的SQL服务器。
在你的情况下,老实说,我会把大部分的工作在前端,你知道的概念去抖动和节流?

yi0zb3m4

yi0zb3m42#

我最近遇到了一个类似的问题,从那以后我就对这个主题很感兴趣。我目前有一个奇怪的,可能是低效的解决方案。基本上,您必须使用全局值,例如会话变量或存储在DB中的值。然后,在服务器端执行指令(搜索、更新等)期间,将同时触发循环,其中,在每次迭代中,将验证我们的全局值是否已更改。该全局值可以是1以继续,0以结束循环(和脚本执行)。
然后,在客户端侧,可以触发第二请求以取消第一请求,为此,将向服务器侧的另一个文件发出请求,其中全局值将从1改变为0,以这样的方式,当在第一文件的循环中验证全局值不再是1而是0时,将结束正在执行的整个执行。
最后,全局值将被重置为1,这将是允许执行未来请求的初始值。
这就是我所思考和尝试的。这不是一个优雅或有效的解决方案,但我还没有找到另一种方法来处理完全取消请求,无论是在客户端还是服务器端。

相关问题