不同的ajax调用轮询周期

时间:2012-05-09 17:17:13

标签: javascript jquery python ajax web2py

让我们假设第一个ajax调用立即生成,控制器调用函数循环直到读取内容,例如:

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

在阅读某些内容之前,用户按下“返回”按钮并发送新的ajax请求,例如:

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

真正调用了第二个ajax调用(显然,我们正在讨论async stuff :))但是在FirstAjax循环完成之前不会打印文本。

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

3 个答案:

答案 0 :(得分:0)

使用Celery

这是过程:

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

  2. 发送SecondAjax,发送任务ID。使用该任务ID取消该任务。 How to cancel a celery task

答案 1 :(得分:0)

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

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

有关详细信息,请参阅here

答案 2 :(得分:0)

问题已解决,这是一个特定的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

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