1

让我们假设第一个 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 停止第一个请求的操作,但不知道如何完成!

4

3 回答 3

0

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

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

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

于 2012-05-09T18:42:06.740 回答
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

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

于 2012-05-10T08:26:55.783 回答
0

使用芹菜

这是过程:

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

  2. 制作SecondAjax,发送任务ID。使用该任务 ID 取消任务。如何取消芹菜任务

于 2012-05-09T17:37:50.837 回答