निम्नलिखित माइक बोस्कॉक के समाधान का एक और संस्करण है और @ केशेन्डर के उत्तर पर @hughes की टिप्पणी से प्रेरित है। यह एकल कॉलबैक को transition
समाप्त करता है।
एक drop
समारोह को देखते हुए ...
function drop(n, args, callback) {
for (var i = 0; i < args.length - n; ++i) args[i] = args[i + n];
args.length = args.length - n;
callback.apply(this, args);
}
... हम ऐसे बढ़ा सकते हैं d3
:
d3.transition.prototype.end = function(callback, delayIfEmpty) {
var f = callback,
delay = delayIfEmpty,
transition = this;
drop(2, arguments, function() {
var args = arguments;
if (!transition.size() && (delay || delay === 0)) { // if empty
d3.timer(function() {
f.apply(transition, args);
return true;
}, typeof(delay) === "number" ? delay : 0);
} else { // else Mike Bostock's routine
var n = 0;
transition.each(function() { ++n; })
.each("end", function() {
if (!--n) f.apply(transition, args);
});
}
});
return transition;
}
एक JSFiddle के रूप में ।
उपयोग करें transition.end(callback[, delayIfEmpty[, arguments...]])
:
transition.end(function() {
console.log("all done");
});
... या transition
खाली होने पर वैकल्पिक देरी से :
transition.end(function() {
console.log("all done");
}, 1000);
... या वैकल्पिक callback
तर्कों के साथ :
transition.end(function(x) {
console.log("all done " + x);
}, 1000, "with callback arguments");
d3.transition.end
यदि मिलिसेकंड की संख्या निर्दिष्ट है या यदि दूसरा तर्क सत्य है, तोcallback
रिक्त के साथ भी पास को लागू किया जाएगा । यह (और केवल उन तर्कों) के लिए कोई अतिरिक्त तर्क भी अग्रेषित करेगा । महत्वपूर्ण रूप से, यह डिफ़ॉल्ट रूप से लागू नहीं होगा यदि खाली है, जो संभवतः ऐसे मामले में एक सुरक्षित धारणा है।transition
callback
callback
transition