Javascript 当请求仍然处于活动/进行中时,如何获得ajax请求的响应?

Javascript 当请求仍然处于活动/进行中时,如何获得ajax请求的响应?,javascript,python,jquery,ajax,basehttprequesthandler,Javascript,Python,Jquery,Ajax,Basehttprequesthandler,我目前的问题是,我希望能够基于python后端运行的函数,在我的前端以JavaScript/HTML显示某种进度(条形图)。为了实现这一点,我在后端定义了一个“计数器”变量,用于跟踪我的进度。我现在唯一的问题是,在前端获取这个计数器变量作为对post请求的响应。这意味着,当后端上的post请求触发的方法仍在运行时,我希望我的post请求能够获得一个包含计数器变量的响应体,该计数器变量应该持续更新 当前我的请求如下所示: function runMethod(){ $.ajax({ url

我目前的问题是,我希望能够基于python后端运行的函数,在我的前端以JavaScript/HTML显示某种进度(条形图)。为了实现这一点,我在后端定义了一个“计数器”变量,用于跟踪我的进度。我现在唯一的问题是,在前端获取这个计数器变量作为对post请求的响应。这意味着,当后端上的post请求触发的方法仍在运行时,我希望我的post请求能够获得一个包含计数器变量的响应体,该计数器变量应该持续更新

当前我的请求如下所示:

function runMethod(){
  $.ajax({
  url: "url:port/runMethod",
  type: 'POST',
  async: true,
  data: 
      JSON.stringify({
          'somedata': someData     
  }),
  success: function (my_data) {
    logger(my_data)
  },
  error: function() {
    alert("error running method");
     }
  })
}

function logger(my_data){
  var logged = my_data['counter'];
  document.getElementById('myprogress').innerHTML = logged;
  console.log(logged);
}
class MyServer(BaseHTTPRequestHandler):
    def __init__(self, request: bytes, client_address, server) -> None:
        self.classes = {t.__name__: t for t in all_classes}
        #self.ldp_experiment = None
        super().__init__(request, client_address, server)

    def do_POST(self):
        # Send our response code, header, and data
        self.send_response(200)
        self.send_header("Content-type", "Application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header('Access-Control-Allow-Headers', 'Content-Type, Accept')
        
        body = self.rfile.read(int(self.headers['Content-Length']))
        print(body)
        try:
            body = json.loads(body)
        except ValueError:
            pass

        if self.path.startswith('/runMethod'):
        contentType = 'application/json'
        logging.info('Running Method...')
        func1 = somefunc(body['somedata'])
        my_progress = someclass.progress_variable
        response = json.dumps({'counter':[my_progress]})

        self.end_headers()
        self.wfile.write(response.encode('UTF-8'))

    if __name__ == "__main__":        
        webServer = HTTPServer(("", serverPort), MyServer)
        print("Server started http://%s:%s" % ("", serverPort))

        try:
             webServer.serve_forever()
        except KeyboardInterrupt:
             pass

        webServer.server_close()
        print("Server stopped.")
我在python API中处理post请求的方式如下:

function runMethod(){
  $.ajax({
  url: "url:port/runMethod",
  type: 'POST',
  async: true,
  data: 
      JSON.stringify({
          'somedata': someData     
  }),
  success: function (my_data) {
    logger(my_data)
  },
  error: function() {
    alert("error running method");
     }
  })
}

function logger(my_data){
  var logged = my_data['counter'];
  document.getElementById('myprogress').innerHTML = logged;
  console.log(logged);
}
class MyServer(BaseHTTPRequestHandler):
    def __init__(self, request: bytes, client_address, server) -> None:
        self.classes = {t.__name__: t for t in all_classes}
        #self.ldp_experiment = None
        super().__init__(request, client_address, server)

    def do_POST(self):
        # Send our response code, header, and data
        self.send_response(200)
        self.send_header("Content-type", "Application/json")
        self.send_header("Access-Control-Allow-Origin", "*")
        self.send_header('Access-Control-Allow-Headers', 'Content-Type, Accept')
        
        body = self.rfile.read(int(self.headers['Content-Length']))
        print(body)
        try:
            body = json.loads(body)
        except ValueError:
            pass

        if self.path.startswith('/runMethod'):
        contentType = 'application/json'
        logging.info('Running Method...')
        func1 = somefunc(body['somedata'])
        my_progress = someclass.progress_variable
        response = json.dumps({'counter':[my_progress]})

        self.end_headers()
        self.wfile.write(response.encode('UTF-8'))

    if __name__ == "__main__":        
        webServer = HTTPServer(("", serverPort), MyServer)
        print("Server started http://%s:%s" % ("", serverPort))

        try:
             webServer.serve_forever()
        except KeyboardInterrupt:
             pass

        webServer.server_close()
        print("Server stopped.")
我看到一些帖子建议使用setInterval()或setTimeout()多次运行一个请求,这可以让我更频繁地获取计数器变量作为响应,但函数也会更频繁地运行,这会破坏整个目的


有人知道我可以做些什么来在我的前端获得这个进度变量吗?

假设这是服务器上的一个长时间运行的过程,而不是一个监控传输数据量的进度条,那么您有两个可行的解决方案。您提到的那个,在间隔/超时时间内发出另一个AJAX请求可以工作,但会导致大规模性能问题。更好的替代方法是使用websocket显示服务器端正在执行的任务的进度,并返回到客户端。不过,您需要创建一个套接字服务器。我一点也不懂Python,但粗略搜索后发现了以下指南: