2

ユーザーがトリガーしたイベントに基づいて、呼び出しが返されない場合は手動で呼び出しをキャンセルできるように、jquery ajax オブジェクトを配列内に格納しています。これらは、長時間実行されると予想される ajax 呼び出しです。

JavaScript

var ajaxCalls = [];
ajaxCalls[0] = $.ajax({...});

$("#cancelButton").on("click", function() { ajaxCalls[0].abort(); });

存在する問題は、abort() メソッドが呼び出された後に jqXHR オブジェクトが配列から消えることです。

魔法のように自分自身を削除してきれいにクリーンアップするので、オブジェクトのメモリを管理することになると、これは素晴らしいように見えます。ただし、自分でクリーンアップしていないように見えるアンチパターンがコードに残ります。また、add メソッドに対して remove のコンパニオン メソッドを作成する目的も無効になります。

これには理由がありますか?配列に複数のオブジェクトが含まれている場合、配列は完全に適切にサイズ変更されます。

文字が jqXHR オブジェクトの場合、この配列

['a', 'b', 'c', 'd']

jqXHRオブジェクト「b」が完了すると、この配列になります

['a', 'c', 'd']

コードを読むと、これが発生することが予想されます

['a', null/undefined, 'c', 'd']

なぜ?

編集:

これは、私がやっていることを再現することができたフィドルです。

直接配列要素として:

[ jqXHR, jqXHR, jqXHR ]

http://jsfiddle.net/itanex/uHX8q/

配列内の Key Value オブジェクト要素として:

[ { key: "key", value: jqXHR }, { key: "key", value: jqXHR } ]

http://jsfiddle.net/itanex/7DSrg/

4

1 に答える 1

2

completeコールを中止すると、コールバックが実行されます。したがって、これが起こります:

ajaxCalls.pop();

そして、あなたのjqXHRオブジェクトがあります。

console.logを表示するために追加pop:

http://jsfiddle.net/ycpZc/

于 2013-09-03T19:05:21.167 に答える