【问题标题】:Different ajax calls with polling cycle具有轮询周期的不同 ajax 调用
【发布时间】:2012-05-09 17:17:12
【问题描述】:

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

【问题讨论】:

标签: javascript jquery python ajax web2py


【解决方案1】:

使用Celery

流程如下:

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

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

【讨论】:

    【解决方案2】:

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

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

    更多详情请见here

    【讨论】:

      【解决方案3】:

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

      谢谢大家,希望对你有帮助!

      【讨论】:

      • 如果您需要在 ajax 调用中使用 session,请使用第二种方式 (session.connect(request, response, db) ),否则您将无法获取保存在行动!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      • 1970-01-01
      • 1970-01-01
      • 2018-02-15
      相关资源
      最近更新 更多