imported>Hsl0 |
imported>Hsl0 |
(같은 사용자의 중간 판 16개는 보이지 않습니다) |
1번째 줄: |
1번째 줄: |
| /** | | /** |
| * 1. renderer: DOM 요소를 만들거나 수정합니다. | | * @requires oojs-ui-widgets |
| * 2. handler: 이벤트를 예약합니다.
| | * @requires ext.gadget.Tasker |
| * 3. trigger: 본격적으로 작업을 수행합니다. | |
| **/ | | **/ |
| var TASKS = Symbol('tasks_queue');
| | registerRenderer(function createPopupButton() { |
| var WAITING = Symbol('waiting_queue');
| | $('.popuplink').each(function() { |
| | | var $header = $(this).find('.popuplink-header'); |
| function Tasker() { | | var widget = new OO.ui.PopupButtonWidget({ |
| this[TASKS] = new Set();
| | label: $(this).find('.popuplink-label'), |
| this[WAITING] = new Set();
| | framed: false, |
| }
| | popup: { |
| Tasker.prototype.push = function push() {
| | head: $header.length || !('autoclose' in this.dataset), |
| var tasker = this;
| | padded: true, |
| var items = arguments;
| | autoClose: 'autoclose' in this.dataset, |
| if(Array.isArray(items[0])) items = items[0];
| | label: $header, |
| else items = Array.from(items);
| | $content: $(this).find('.popuplink-content') |
| items.forEach(function(item) {
| | } |
| if(typeof item === 'function') this[TASKS].add(item);
| | }); |
| else this[WAITING].add(item);
| | $(this).html(widget.$element); |
| });
| | }); |
| return this;
| |
| };
| |
| Tasker.prototype.wait = function wait() {
| |
| var tasker = this;
| |
| return new Promise(function(resolve) {
| |
| function capture(queue) {
| |
| var arr = Array.from(queue);
| |
| queue.clear();
| |
| return arr;
| |
| }
| |
| | |
| Promise.all(capture(tasker[WAITING])).then(function handle() {
| |
| var captured = capture(tasker[WAITING]);
| |
| if(captured.length) return Promise.all(captured).then(handle);
| |
| else resolve();
| |
| });
| |
| });
| |
| };
| |
| Tasker.prototype.run = function run() {
| |
| var tasker = this;
| |
| this[TASKS].forEach(function(task) {
| |
| tasker[WAITING].add(task());
| |
| });
| |
| return this;
| |
| };
| |
| window.Tasker = Tasker;
| |
| | |
| var taskers = {
| |
| renderer: new Tasker(),
| |
| handler: new Tasker(),
| |
| trigger: new Tasker()
| |
| };
| |
| function runTask() {
| |
| var tasker = this;
| |
| this[TASKS].forEach(function(task) {
| |
| if(typeof task === 'string') tasker[TASKS].add(mw.loader.using(task));
| |
| else tasker[TASKS].add(task());
| |
| });
| |
| return this;
| |
| }
| |
| taskers.renderer.push = function() {
| |
| Tasker.prototype.apply(this, arguments);
| |
| if(documentReady) this.run();
| |
| return this;
| |
| };
| |
| taskers.handler.push = function() {
| |
| Tasker.prototype.apply(this, arguments);
| |
| if(rendererDone) this.run();
| |
| return this;
| |
| };
| |
| taskers.trigger.push = function() {
| |
| Tasker.prototype.apply(this, arguments);
| |
| if(hendlerDone) this.run();
| |
| return this;
| |
| };
| |
| taskers.renderer.run = runTask;
| |
| taskers.handler.run = runTask;
| |
| taskers.trigger.run = runTask;
| |
| | |
| var documentReady = false;
| |
| var rendererDone = false;
| |
| var handlerDone = false;
| |
| | |
| window.registerRenderer = function registerRenderer() {
| |
| var renderers = arguments;
| |
| if(Array.isArray(renderers[0])) renderers = renderers[0];
| |
| taskers.renderer.push(arguments);
| |
| }; | |
| window.registerHandler = function registerHandler() {
| |
| var handlers = arguments;
| |
| if(Array.isArray(handlers[0])) handlers = handlers[0];
| |
| taskers.handler.push(arguments);
| |
| }; | |
| window.registerTrigger = function registerTrigger() {
| |
| var triggers = arguments;
| |
| if(Array.isArray(triggers[0])) triggers = triggers[0];
| |
| taskers.trigger.push(arguments);
| |
| };
| |
| | |
| $(function() { | |
| documentReady = true;
| |
| taskers.renderer.run().wait().then(function() {
| |
| rendererDone = true;
| |
| return taskers.handler.run().wait();
| |
| }).then(function() {
| |
| handlerDone = true;
| |
| taskers.trigger.run();
| |
| });
| |
| }); | | }); |