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