具有轮询周期的不同 ajax 调用

Different ajax calls with polling cycle

本文关键字:ajax 调用 周期      更新时间:2023-09-26

假设第一个 ajax 调用是立即进行的,控制器调用的函数循环直到读取某些内容,例如:

def FirstAjax():
    while True:
        if something is read:
            val = something
            break
    return val

在读取某些内容之前,用户按下"返回"按钮并发送一个新的 ajax 请求,例如:

def SecondAjax():
    print "Response from second ajax"

第二个 ajax 调用确实被调用(显然,我们谈论的是异步的东西:)),但在 FirstAjax 循环完全完成之前不会打印文本。

我希望第二个请求告诉python停止第一个请求的操作,但不知道如何完成!

使用芹菜。

过程如下:

  1. 提出FirstAjax请求。Python 使用芹菜对任务进行排队。您可以让任务立即启动,也可以在几分钟/几小时/几天内启动。FirstAjax 发回所创建任务的 id,而任务本身则排队等待在后台执行。使用芹菜任务 ID

  2. 进行SecondAjax ,随任务 ID 一起发送。使用该任务 ID 取消任务。如何取消芹菜任务。

第二个 Ajax 请求可能会被阻止,直到第一个请求完成,因为会话文件可能被锁定。假设第一个 Ajax 请求不需要使用该会话,您可以让它解锁会话:

def FirstAjax():
    session.forget(response) # unlock the session file
    [rest of code]

有关更多详细信息,请参阅此处。

问题解决了,这是一个特定的web2py问题。

def FirstAjax():
    session.forget(response) # unlock the session file
    [rest of code]

讨论web2py不锁定会话文件,以便第二个ajax可以立即启动。另一种方法是设置:

session.connect(request, response, db)

在模型中,这意味着会话不会保存在文件中,而是保存在 DAL "db" 中,因此会话不会被锁定。

这两种解决方案对于我需要的是相同的。

就我而言,我还需要在按下后退按钮时进行设备释放,只需添加一个要在轮询周期中检查的标志,例如:

def FirstAjax():
    session.forget(response) # unlock the session file
    HSCAN.SetLeave(False)
    HSCAN.PollingCycle()
    #Rest of code    
def SecondAjax():
    HSCAN.SetLeave(True)
    #Rest of code 
class myHandScanner():
    def __init__(self):
        self.leave = False
    def SetLeave(self, leave):
        self.leave = leave
    def PollingCycle(self):
        while True:
            if self.leave:
                #Do device release
                return
            if something is read:
                val = something
                break
        #Do device release
        return val

谢谢大家,希望这有帮助!