사용자:Hsl0/연구소/3.js
참고: 설정을 저장한 후에 바뀐 점을 확인하기 위해서는 브라우저의 캐시를 새로 고쳐야 합니다.
- 파이어폭스 / 사파리: Shift 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5 또는 Ctrl-R을 입력 (Mac에서는 ⌘-R)
- 구글 크롬: Ctrl-Shift-R키를 입력 (Mac에서는 ⌘-Shift-R)
- 인터넷 익스플로러 / 엣지: Ctrl 키를 누르면서 새로 고침을 클릭하거나, Ctrl-F5를 입력.
- 오페라: Ctrl-F5를 입력.
/**
* 0. 모든 패키지가 로딩되고 DOM이 준비될때까지 기다립니다. 오류 여부는 상관없습니다.
* 1. renderer: DOM 요소를 만들거나 수정합니다.
* 2. handler: 이벤트를 예약합니다.
* 3. trigger: 본격적으로 작업을 수행합니다.
**/
var TASKS = Symbol('tasks_queue');
var WAITING = Symbol('waiting_queue');
function Tasker() {
this[TASKS] = new Set();
this[WAITING] = new Set();
}
Tasker.prototype.push = function push() {
var tasker = this;
var items = arguments;
if(items[0] && typeof items[0][Symbol.iterator] === 'function') items = Array.from(items[0]);
else items = Array.from(items);
items.forEach(function(item) {
if(typeof item === 'function') tasker[TASKS].add(item);
else tasker[WAITING].add(item);
});
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[WAITING].add(mw.loader.using(task));
else tasker[WAITING].add(task());
});
return this;
}
taskers.renderer.push = function() {
Tasker.prototype.push.apply(this, arguments);
if(documentReady && modulesReady) this.run();
return this;
};
taskers.handler.push = function() {
Tasker.prototype.push.apply(this, arguments);
if(rendererDone) this.run();
return this;
};
taskers.trigger.push = function() {
Tasker.prototype.push.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 modulesReady = false;
var rendererDone = false;
var handlerDone = false;
window.registerRenderer = function registerRenderer() {
var renderers = arguments;
if(renderers[0] && typeof renderers[0][Symbol.iterator] === 'function') renderers = renderers[0];
taskers.renderer.push(renderers);
};
window.registerHandler = function registerHandler() {
var handlers = arguments;
if(handlers[0] && typeof handlers[0][Symbol.iterator] === 'function') handlers = handlers[0];
taskers.handler.push(handlers);
};
window.registerTrigger = function registerTrigger() {
var triggers = arguments;
if(triggers[0] && typeof triggers[0][Symbol.iterator] === 'function') triggers = triggers[0];
taskers.trigger.push(triggers);
};
$(function() {
documentReady = true;
mw.loader.using(RLPAGEMODULES).always(function() {
modulesReady = true;
return taskers.renderer.run().wait();
}).always(function() {
rendererDone = true;
return taskers.handler.run().wait();
}).always(function() {
handlerDone = true;
taskers.trigger.run();
});
});