1

ブラウジングと試行の夜の後、何かが機能していますが、これがすべて正しいのか、それとも改善できるのか疑問に思います。私はjavascriptもjquery/ajaxも頻繁に使用していないのでお願いします....

django アプリケーションでは、セロリ タスクを実行しています。タスクが完了したら、ブラウザを結果で更新したいと思います。

このために、setTimeout を使用して JavaScript タイマーを作成します (成功したら停止できます)。

今、私は複数のタイマーをサポートできるようにしたかったのです。更新したいフィールド (またはタスク) ごとに 1 つ。無名関数に新しいタイムアウトを設定する方法がわからないので、名前を付けてグローバルにしました。あれは正しいですか?これを行うより良い方法はありますか?

ポール・ボーマンズ

{% 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 %}
4

2 に答える 2

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>
于 2012-11-14T22:07:21.693 に答える
0

これは資源の浪費であることに注意する必要があります。それは正しいことではありません。あなたがしたいことは、実装することですPUSH

django でこれを行うには、evserver、「Lightweight Asynchronous Python WSGI Server」をチェックアウトします。有望そうです。また、チェックアウトして、 diesel.ioをご覧ください。このようにして、プッシュするデータがある場合にのみ、サーバーがブラウザーにデータをプッシュするようにします (クライアント側から t をチェックする必要はありません)。

セロリを使用している場合は、python をいじるのが怖くないと思いますので、正しく行ってください。

于 2012-11-15T00:01:50.903 に答える