经过一个晚上的浏览和尝试我有一些工作,但我想知道这一切是否正确,还是可以改进。我问,因为我不经常使用javascript或jquery / ajax ....
在django应用程序中,我有一个celery任务正在运行,我想在任务完成时用结果更新浏览器。
为此,我使用setTimeout创建一个javascript计时器(所以我可以在成功时停止它。)
现在我希望能够支持多个计时器;我要更新的每个字段(或任务)一个;我不知道如何在一个匿名函数上设置一个新的超时,所以我给了它一个名字并使其成为全局;那是对的吗?有没有更好的方法呢?
Paul Bormans
{% block jscript %}
<script>
function updateTaskResult(i, e) {
$.ajax({
type: "GET",
url: "{% url 'task_status' %}",
cache: false,
data: {task_id: e.id},
context: e
}).done(function(json) {
$(e).html("state=" + json.state + " result=" + json.result);
if(json.state !== "{{ success }}") {
setTimeout(updateTaskResult, 1000, i, e);
}
});
}
$("div.status").each(function(i, e) {
updateTaskResult(i,e);
});
</script>
{% endblock %}
答案 0 :(得分:1)
要避免全局变量,可以将代码包装在立即运行的匿名函数中。这将为您创建一个私有变量范围。
此外,由于您未在AJAX回调中使用关键字 this ,因此无需将上下文设置为 e 。
<script>
(function() {
var updateTaskResult = function (i, e) {
$.ajax({
type: "GET",
url: "{% url 'task_status' %}",
cache: false,
data: {task_id: e.id},
}).done(function(json) {
$(e).html("state=" + json.state + " result=" + json.result);
if(json.state !== "{{ success }}") {
setTimeout(updateTaskResult, 1000, i, e);
}
});
}
$("div.status").each(function(i, e) {
updateTaskResult(i,e);
});
})();
</script>
匿名函数可以与setTimeout一起使用,如下所示:
<script>
setTimeout(function () {
// Do stuff.
}, 1000);
</script>
答案 1 :(得分:0)