如何从函数内部(轮询)更新成功事件的全局变量?

时间:2018-06-11 18:02:45

标签: javascript xmlhttprequest polling

<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>

所以,我有一个带有Async请求的代码来查看后端进程的状态。所以,首先我将status设置为1(即通过Django中的上下文检查check_status)。因此,如果status为1,那么var timer行将每2秒开始调用call_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.check_status。在函数上下文之后,它将始终保持为1并且仅进入if循环;无论从JSON响应中收到什么。

所以,问题是如果status为0,我将如何更新result.check_status并清除超时(即转到else部分)(即{'check_status':2}作为响应来自API调用)??

1 个答案:

答案 0 :(得分:1)

以下是如何做到这一点:

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();

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