Skip to content

Commit 21aca89

Browse files
committed
feat: 为gDomObserver添加调试日志开关,默认关闭
1 parent abad7a9 commit 21aca89

1 file changed

Lines changed: 33 additions & 17 deletions

File tree

src/common.js

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -626,7 +626,10 @@ function getValidDomList(queryList) {
626626
* - 按需启动观察服务以节省资源,任务全部完成时自动停止。
627627
*/
628628
const gDomObserver = (() => {
629-
let _observer = null, _rafId = null;
629+
let _observer = null, _rafId = null, _debug = false;
630+
const _log = (...a) => _debug && console.log ("[gDomObserver]", ...a);
631+
const _warn = (...a) => _debug && console.warn ("[gDomObserver]", ...a);
632+
const _error = (...a) => _debug && console.error("[gDomObserver]", ...a);
630633
const _pendingMap = new Map();
631634
class Task {
632635
constructor(deadline, resolve, reject) {
@@ -643,7 +646,7 @@ const gDomObserver = (() => {
643646
cancelAnimationFrame(_rafId);
644647
_rafId = null;
645648
}
646-
console.log("DouyuEX gDomObserver: 所有任务完成,停止观察实例");
649+
_log("DouyuEX gDomObserver: 所有任务完成,停止观察实例");
647650
}
648651
}
649652
function _parseTimeout(timeout) {
@@ -666,11 +669,11 @@ const gDomObserver = (() => {
666669
const element = _rawQuery(selector);
667670
for (const task of group.tasks) {
668671
if (current >= task.deadline) {
669-
console.warn("DouyuEX gDomObserver: 计时到达上限,终止等待任务", selector);
672+
_warn("DouyuEX gDomObserver: 计时到达上限,终止等待任务", selector);
670673
task.reject(new Error(`DouyuEX waitForElement: Timeout - "${selector}"`));
671674
group.tasks.delete(task);
672675
} else if (element) {
673-
console.log("DouyuEX gDomObserver: 目标元素出现,完成等待任务", element);
676+
_log("DouyuEX gDomObserver: 目标元素出现,完成等待任务", element);
674677
task.resolve(element);
675678
group.tasks.delete(task);
676679
}
@@ -707,26 +710,26 @@ const gDomObserver = (() => {
707710
*/
708711
waitForElement(selector, timeout = null, signal = null) {
709712
if (signal && signal.aborted) {
710-
console.warn("DouyuEX gDomObserver: 信号已中止,拒绝创建任务", selector);
713+
_warn("DouyuEX gDomObserver: 信号已中止,拒绝创建任务", selector);
711714
return Promise.reject(signal.reason || new DOMException("Aborted", "AbortError"));
712715
}
713716
const selectorTrimmed = typeof selector === "string" ? selector.trim() : "";
714717
let element;
715718
try {
716719
element = _rawQuery(selectorTrimmed, false, true);
717720
} catch (err) {
718-
console.error("DouyuEX gDomObserver: 非法的选择器,拒绝创建任务", selector, err);
721+
_error("DouyuEX gDomObserver: 非法的选择器,拒绝创建任务", selector, err);
719722
return Promise.reject(new Error(`DouyuEX waitForElement: Invalid selector - "${selector}", ${err.message}`));
720723
}
721724
const existing = _pendingMap.get(selectorTrimmed);
722725
if (element) {
723726
if (existing) {
724-
console.log("DouyuEX gDomObserver: 目标元素存在,完成已有任务", element);
727+
_log("DouyuEX gDomObserver: 目标元素存在,完成已有任务", element);
725728
for (const task of existing.tasks) task.resolve(element);
726729
_pendingMap.delete(selectorTrimmed);
727730
_disconnect();
728731
} else {
729-
console.log("DouyuEX gDomObserver: 目标元素存在,直接返回结果", element);
732+
_log("DouyuEX gDomObserver: 目标元素存在,直接返回结果", element);
730733
}
731734
return Promise.resolve(element);
732735
}
@@ -741,7 +744,7 @@ const gDomObserver = (() => {
741744
const task = new Task(deadline, resolveFn, rejectFn);
742745
if (signal) {
743746
signal.addEventListener("abort", () => {
744-
console.warn("DouyuEX gDomObserver: 收到外部信号,终止等待任务", selectorTrimmed);
747+
_warn("DouyuEX gDomObserver: 收到外部信号,终止等待任务", selectorTrimmed);
745748
task.reject(signal.reason || new DOMException("Aborted", "AbortError"));
746749
const group = _pendingMap.get(selectorTrimmed);
747750
if (!group) return;
@@ -751,17 +754,17 @@ const gDomObserver = (() => {
751754
}, { once: true });
752755
}
753756
if (existing) {
754-
console.log("DouyuEX gDomObserver: 等待元素相同,添加新的任务", selectorTrimmed, deadlineLabel);
757+
_log("DouyuEX gDomObserver: 等待元素相同,添加新的任务", selectorTrimmed, deadlineLabel);
755758
existing.tasks.add(task);
756759
} else {
757760
_pendingMap.set(selectorTrimmed, { tasks: new Set([task]) });
758761
if (!_observer) {
759762
const root = document.body || document.documentElement || document;
760763
_observer = new MutationObserver(_checkElements);
761764
_observer.observe(root, { childList: true, subtree: true });
762-
console.log("DouyuEX gDomObserver: 启动观察实例,创建首个任务", selectorTrimmed, deadlineLabel);
765+
_log("DouyuEX gDomObserver: 启动观察实例,创建首个任务", selectorTrimmed, deadlineLabel);
763766
} else {
764-
console.log("DouyuEX gDomObserver: 复用观察实例,加入任务队列", selectorTrimmed, deadlineLabel);
767+
_log("DouyuEX gDomObserver: 复用观察实例,加入任务队列", selectorTrimmed, deadlineLabel);
765768
}
766769
}
767770
return promise;
@@ -786,18 +789,18 @@ const gDomObserver = (() => {
786789
*/
787790
raceForElement(selectors, timeout = null) {
788791
if (!Array.isArray(selectors) || selectors.length === 0) {
789-
console.error("DouyuEX gDomObserver: 无效的选择器,竞速任务中止");
792+
_error("DouyuEX gDomObserver: 无效的选择器,竞速任务中止");
790793
return Promise.reject(new Error(`DouyuEX raceForElement: Empty array of selectors - ${selectors}`));
791794
}
792795
const controller = new AbortController(), parsedTimeout = _parseTimeout(timeout);
793796
let finished = false, rejectedCount = 0, timeoutId = null;
794-
console.log("DouyuEX gDomObserver: 启动竞速任务,等待元素列表", selectors);
797+
_log("DouyuEX gDomObserver: 启动竞速任务,等待元素列表", selectors);
795798
return new Promise((resolve, reject) => {
796799
if (parsedTimeout != null) {
797800
timeoutId = setTimeout(() => {
798801
if (finished) return;
799802
finished = true;
800-
console.warn("DouyuEX gDomObserver: 超过最大时长,竞速任务失败");
803+
_warn("DouyuEX gDomObserver: 超过最大时长,竞速任务失败");
801804
const timeoutError = new Error(`DouyuEX raceForElement: No elements appeared within the timeout - ${selectors}`);
802805
controller.abort(timeoutError);
803806
reject(timeoutError);
@@ -808,21 +811,34 @@ const gDomObserver = (() => {
808811
if (finished) return;
809812
finished = true;
810813
clearTimeout(timeoutId);
811-
console.log("DouyuEX gDomObserver: 竞速任务完成,首先出现元素", selector, element);
814+
_log("DouyuEX gDomObserver: 竞速任务完成,首先出现元素", selector, element);
812815
controller.abort();
813816
resolve({ selector, element });
814817
}).catch(err => {
815818
if (finished) return;
816819
if (++rejectedCount === selectors.length) {
817820
finished = true;
818821
clearTimeout(timeoutId);
819-
console.warn("DouyuEX gDomObserver: 无效的选择器,竞速任务失败", err);
822+
_warn("DouyuEX gDomObserver: 无效的选择器,竞速任务失败", err);
820823
reject(new Error(`DouyuEX raceForElement: All selectors are invalid - ${selectors}`));
821824
}
822825
});
823826
}
824827
});
825828
},
829+
/*
830+
* 设置调试日志的开关状态:
831+
* @description
832+
* - 默认关闭,所有内部日志(log / warn / error)均不输出;
833+
* - 开启后,内部运行状态、任务创建、元素匹配、超时及中止等事件均会输出至控制台;
834+
* - 可在任意时刻调用,实时生效,不影响已有的等待任务。
835+
* @param {any} enabled - 是否开启调试日志,传入任意真值开启,假值关闭
836+
* @returns {void}
837+
* @example
838+
* gDomObserver.setDebug(true); // 开启,输出所有内部日志
839+
* gDomObserver.setDebug(false); // 关闭,静默运行(默认)
840+
*/
841+
setDebug(enabled) { _debug = !!enabled; },
826842
};
827843
})();
828844

0 commit comments

Comments
 (0)