select
要素のイベントのリスナーがありchange
ます。変更すると、ファイルがフェッチされ、複雑なSVGが計算されてDOMにロードされます(読み取り:かなりの数のCPUサイクルが必要です)。問題は、select
(コード化されたキーボードショートカットを介して)非常にすばやく変更すると、複数のものがSVGコンテナーにロードされることです。一度に1つだけロードする必要があります。これを改善するために、私はこれを行いました(半疑似):
select.on("change", function() { queue(this.val); });
var queuedFile, state = "ready";
function queue(file) {
queuedFile = file;
// NB: in real code, queuedFile is a property and the getter empties the queue
if (state === "ready") { loadFile(queuedFile); }
}
function loadFile(file) {
state = "busy";
ajaxGet(file, function(result) {
// lots of statements, iterators, calls to other fns
state = "ready";
// NB: again in real code the getter empties the queue
var qf = queuedFile;
if (qf) { clearSVG(); loadFile(qf); }
}); // end ajaxGet
}
つまり、select
変更時に新しいファイルをキューに入れ、ファイルローダーが別のファイルのロードでビジーでない場合はロードし、それ以外の場合は何もしません。ファイルローダーが完了したときに、キューに入れられたファイルがある場合は、SVGをクリアして、キューに入れられたファイルをロードします。このように、SVGコンテナ内のファイルは一度に1つしか許可されないようです。
実際には、チェックインされたときstate
は決してないので、SVGに複数のファイルがロードされています。ショーの直後ですが。ここで何が欠けていますか?スコープの問題ではないと思います。"busy"
queue()
console.log(state)
state = "busy"
"busy"
queuedFile
完全を期すために、私のキュープロパティは次のとおりです。
// given: all of this code is enclosed in a function that returns an object "viewer".
// (only one instance of the "viewer" is created)
Object.defineProperty(viewer, "queuedFile", {
get: function () {
console.log("dequeuing", this.filequeue);
var buffer = this.filequeue;
this.filequeue = null;
return buffer;
},
set: function (newval) {
console.log("queuing", newval);
this.filequeue = newval;
}
});