Javascript 如何从函数内部更新成功事件的全局变量(轮询)? var status={{check_status}}; call_polling=函数(){ //对API的轮询请求(异步) 成功:功能(结果){ 状态=结果。检查状态; } } 如果(状态){ var timer=setInterval(函数(){call_polling();},2000); } 否则{ clearInterval(函数(){call_polling();}); }

Javascript 如何从函数内部更新成功事件的全局变量(轮询)? var status={{check_status}}; call_polling=函数(){ //对API的轮询请求(异步) 成功:功能(结果){ 状态=结果。检查状态; } } 如果(状态){ var timer=setInterval(函数(){call_polling();},2000); } 否则{ clearInterval(函数(){call_polling();}); },javascript,xmlhttprequest,polling,Javascript,Xmlhttprequest,Polling,因此,我有一个带有异步请求的代码来查看后端进程的状态。因此,首先我将status设置为1(即通过Django中的上下文检查_status)。因此,如果status为1,则var timer线路将开始每隔2秒调用call\u polling()函数 因此,call_polling()将查询API以检查状态,并且在成功响应时,如{'check_status':1}它将传输status=1。指示后端进程仍在运行。后端处理完成后,我将JSON响应传递为{'check_status':0},其中 应该是s

因此,我有一个带有异步请求的代码来查看后端进程的状态。因此,首先我将
status
设置为1(即通过Django中的上下文检查_status)。因此,如果
status
为1,则
var timer
线路将开始每隔2秒调用
call\u polling()
函数 因此,
call_polling()
将查询API以检查状态,并且在成功响应时,如
{'check_status':1}
它将传输
status=1
。指示后端进程仍在运行。后端处理完成后,我将JSON响应传递为
{'check_status':0}
,其中 应该是
status=0
,然后它将不会进入
if
,而是清除轮询间隔(我们知道后台处理已经完成),对API的异步调用应该停止

但它不起作用,javascript仍然每2秒对API请求进行一次call_polling()。我找到了原因,因为
var status
被全局声明为
1
,即使我替换了
status=result。检查\u status
。在函数上下文之后,它将始终保持1,并仅进入if循环;无论它从JSON响应接收到什么

所以,问题是如果
结果为0(即{check\u status':2}作为API调用的响应),我将如何更新
状态
并清除超时(即转到else部分)

<script>

var status = {{ check_status }};

call_polling = function() {
    // polling request to API (async)
    success:function(result){
        status = result.check_status;
    }

}


if(status) {
    var timer = setInterval(function() { call_polling(); }, 2000);
}
else{
clearInterval(function(){ call_polling();});
}
</script>

简言之,只要响应是
1
,就会为检查设置一个新的超时。

整个
if
逻辑在加载页面时只运行一次。如果你想一次又一次地运行它,你必须将它移动到
success
回调(或者将它放入一个函数中并从那里调用它。它确实移动到success回调@Chris G“it does move”…?不知道你的意思。无论如何,请检查我的答案。为什么只在回调函数中使用status时需要将其设置为全局变量。事件初始赋值也不是used@HridayModi你怎么知道的?OP显然只发布了相关的代码,所以你怎么会认为
status
没有被其他人使用呢在哪里?事实上这很有可能,因为整个练习在其他地方毫无意义。确切地说,如果在其他地方使用
status
,它的实现是错误的,因为它将在API回调中被重写。@ChrisG实现回答了我的需要。
var status = {{ check_status }};

function call_polling() {
    // polling request to API (async)
    success: function (result){
        status = result.check_status;
        if (status) setTimeout(call_polling, 2000);
    }
}

call_polling();