Skip to content

Commit 55440e7

Browse files
authored
🎨 异步代码优化 (#651)
* 异步代码优化 * flatMap * GMSend.XHRFormData 异步代码优化 * 刪未使用代碼 * fetch.ts 异步代码优化 * importResources 异步代码优化 * FormData 异步代码优化 * BackupExport 异步代码优化 * loadConfigs 异步代码优化 * getLanguage 异步代码优化 * buildScriptRunResource 异步代码优化
1 parent 5b01c10 commit 55440e7

12 files changed

Lines changed: 233 additions & 259 deletions

File tree

src/app/service/content/gm_api.ts

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -633,36 +633,32 @@ export default class GMApi extends GM_Base {
633633
if (details.data instanceof FormData) {
634634
// 处理FormData
635635
param.dataType = "FormData";
636-
const data: Array<GMSend.XHRFormData> = [];
637636
const keys: { [key: string]: boolean } = {};
638637
details.data.forEach((val, key) => {
639638
keys[key] = true;
640639
});
641640
// 处理FormData中的数据
642-
await Promise.all(
643-
Object.keys(keys).map((key) => {
644-
const values = (<FormData>details.data).getAll(key);
645-
return Promise.all(
646-
values.map(async (val) => {
647-
if (val instanceof File) {
648-
const url = await a.CAT_createBlobUrl(val);
649-
data.push({
650-
key,
651-
type: "file",
652-
val: url,
653-
filename: val.name,
654-
});
655-
} else {
656-
data.push({
641+
const data = (await Promise.all(
642+
Object.keys(keys).flatMap((key) =>
643+
(<FormData>details.data).getAll(key).map((val) =>
644+
val instanceof File
645+
? a.CAT_createBlobUrl(val).then(
646+
(url) =>
647+
({
648+
key,
649+
type: "file",
650+
val: url,
651+
filename: val.name,
652+
}) as GMSend.XHRFormData
653+
)
654+
: ({
657655
key,
658656
type: "text",
659657
val,
660-
});
661-
}
662-
})
663-
);
664-
})
665-
);
658+
} as GMSend.XHRFormData)
659+
)
660+
)
661+
)) as GMSend.XHRFormData[];
666662
param.data = data;
667663
} else if (details.data instanceof Blob) {
668664
// 处理blob

src/app/service/offscreen/gm_api.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,10 +148,14 @@ export default class GMApi {
148148
const data = new FormData();
149149
if (details.data && details.data instanceof Array) {
150150
await Promise.all(
151-
details.data.map(async (val: GMSend.XHRFormData) => {
151+
details.data.map((val: GMSend.XHRFormData) => {
152152
if (val.type === "file") {
153-
const file = new File([await (await fetch(val.val)).blob()], val.filename!);
154-
data.append(val.key, file, val.filename);
153+
return fetch(val.val)
154+
.then((res) => res.blob())
155+
.then((blob) => {
156+
const file = new File([blob], val.filename!);
157+
data.append(val.key, file, val.filename);
158+
});
155159
} else {
156160
data.append(val.key, val.val);
157161
}

src/app/service/service_worker/fetch.ts

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -80,16 +80,17 @@ export async function fetchIconByDomain(domain: string): Promise<TMsgResponse<st
8080
}
8181

8282
const urls = await Promise.all(
83-
icons.map(async (icon) => {
84-
try {
85-
const res = await fetch((fetchingUrl = icon), { method: "HEAD", signal: timeoutAbortSignal(timeout) });
86-
if (res.ok && checkFileNameEqual(res.url, icon)) {
87-
return res.url;
88-
}
89-
} catch {
90-
// 忽略错误
91-
}
92-
})
83+
icons.map((icon) =>
84+
fetch((fetchingUrl = icon), { method: "HEAD", signal: timeoutAbortSignal(timeout) })
85+
.then((res) => {
86+
if (res.ok && checkFileNameEqual(res.url, icon)) {
87+
return res.url;
88+
}
89+
})
90+
.catch(() => {
91+
// 忽略错误
92+
})
93+
)
9394
);
9495

9596
return msgResponse(0, urls.filter((url) => !!url) as string[]);

src/app/service/service_worker/runtime.ts

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -467,36 +467,36 @@ export class RuntimeService {
467467
enableScript.push(scriptRes as ScriptLoadInfo);
468468
}
469469

470-
await Promise.all([
471-
// 加载value
472-
...enableScript.map(async (script) => {
473-
const value = await this.value.getScriptValue(script!);
474-
script.value = value;
475-
}),
476-
// 加载resource
477-
...enableScript.map(async (script) => {
478-
const resource = await this.resource.getScriptResources(script, false);
479-
script.resource = resource;
480-
Object.keys(script.resource).forEach((name) => {
481-
const res = script.resource[name];
482-
// 删除base64以节省资源
483-
// 如果有content就删除base64
484-
if (res.content) {
485-
res.base64 = undefined;
470+
const { value, resource, scriptDAO } = this;
471+
await Promise.all(
472+
enableScript.flatMap((script) => [
473+
// 加载value
474+
value.getScriptValue(script!).then((value) => {
475+
script.value = value;
476+
}),
477+
// 加载resource
478+
resource.getScriptResources(script, false).then((resource) => {
479+
for (const name of Object.keys(resource)) {
480+
const res = script.resource[name];
481+
// 删除base64以节省资源
482+
// 如果有content就删除base64
483+
if (res.content) {
484+
res.base64 = undefined;
485+
}
486486
}
487-
});
488-
}),
489-
// 加载code相关的信息
490-
...enableScript.map(async (script) => {
491-
const code = await this.scriptDAO.scriptCodeDAO.get(script.uuid);
492-
if (code) {
493-
const metadataStr = getMetadataStr(code.code) || "";
494-
const userConfigStr = getUserConfigStr(code.code) || "";
495-
script.metadataStr = metadataStr;
496-
script.userConfigStr = userConfigStr;
497-
}
498-
}),
499-
]);
487+
script.resource = resource;
488+
}),
489+
// 加载code相关的信息
490+
scriptDAO.scriptCodeDAO.get(script.uuid).then((code) => {
491+
if (code) {
492+
const metadataStr = getMetadataStr(code.code) || "";
493+
const userConfigStr = getUserConfigStr(code.code) || "";
494+
script.metadataStr = metadataStr;
495+
script.userConfigStr = userConfigStr;
496+
}
497+
}),
498+
])
499+
);
500500

501501
// 更新资源使用了file协议的脚本
502502
const needUpdateRegisteredUserScripts = enableScript.filter((script) => {

src/app/service/service_worker/script.ts

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -326,30 +326,30 @@ export class ScriptService {
326326
return this.scriptCodeDAO.get(uuid);
327327
}
328328

329-
async buildScriptRunResource(script: Script): Promise<ScriptRunResource> {
329+
buildScriptRunResource(script: Script): Promise<ScriptRunResource> {
330330
const ret: ScriptRunResource = <ScriptRunResource>Object.assign(script);
331-
332331
// 自定义配置
333332
if (ret.selfMetadata) {
334333
ret.metadata = { ...ret.metadata };
335334
Object.keys(ret.selfMetadata).forEach((key) => {
336335
ret.metadata[key] = ret.selfMetadata![key];
337336
});
338337
}
339-
340-
ret.value = await this.valueService.getScriptValue(ret);
341-
342-
ret.resource = await this.resourceService.getScriptResources(ret, true);
343-
344-
ret.flag = randomMessageFlag();
345-
const code = await this.getCode(ret.uuid);
346-
if (!code) {
347-
throw new Error("code is null");
348-
}
349-
ret.code = code.code;
350-
ret.code = compileScriptCode(ret);
351-
352-
return ret;
338+
return Promise.all([
339+
this.valueService.getScriptValue(ret),
340+
this.resourceService.getScriptResources(ret, true),
341+
this.getCode(script.uuid),
342+
]).then(([value, resource, code]) => {
343+
if (!code) {
344+
throw new Error("code is null");
345+
}
346+
ret.value = value;
347+
ret.resource = resource;
348+
ret.flag = randomMessageFlag();
349+
ret.code = code.code;
350+
ret.code = compileScriptCode(ret);
351+
return ret;
352+
});
353353
}
354354

355355
async excludeUrl({ uuid, url, remove }: { uuid: string; url: string; remove: boolean }) {

src/app/service/service_worker/synchronize.ts

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ export class SynchronizeService {
103103
}
104104
// 获取所有脚本
105105
const list = await this.scriptDAO.all();
106-
return Promise.all(list.map(async (script): Promise<ScriptBackupData> => this.generateScriptBackupData(script)));
106+
return Promise.all(list.map((script) => this.generateScriptBackupData(script)));
107107
}
108108

109109
async generateScriptBackupData(script: Script): Promise<ScriptBackupData> {
@@ -178,20 +178,14 @@ export class SynchronizeService {
178178
requiresCss: ResourceBackup[];
179179
}) {
180180
const { uuid, requires, resources, requiresCss } = data;
181-
const ret: Promise<any>[] = [];
182-
// 处理requires
183-
requires.forEach((item) => {
184-
ret.push(this.resource.importResource(uuid, item, "require"));
185-
});
186-
// 处理resources
187-
resources.forEach((item) => {
188-
ret.push(this.resource.importResource(uuid, item, "resource"));
189-
});
190-
// 处理requiresCss
191-
requiresCss.forEach((item) => {
192-
ret.push(this.resource.importResource(uuid, item, "require-css"));
193-
});
194-
return Promise.all(ret).then(() => {
181+
return Promise.all([
182+
// 处理requires
183+
...requires.map((item) => this.resource.importResource(uuid, item, "require")),
184+
// 处理resources
185+
...resources.map((item) => this.resource.importResource(uuid, item, "resource")),
186+
// 处理requiresCss
187+
...requiresCss.map((item) => this.resource.importResource(uuid, item, "require-css")),
188+
]).then(() => {
195189
return;
196190
});
197191
}

src/app/service/service_worker/utils.ts

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,3 @@
1-
export function isExtensionRequest(
2-
details: chrome.webRequest.OnBeforeRequestDetails & { originUrl?: string }
3-
): boolean {
4-
return !!(
5-
(details.initiator && chrome.runtime.getURL("").startsWith(details.initiator)) ||
6-
(details.originUrl && details.originUrl.startsWith(chrome.runtime.getURL("")))
7-
);
8-
}
9-
101
export function getRunAt(runAts: string[]): chrome.extensionTypes.RunAt {
112
if (runAts.length === 0) {
123
return "document_idle";
@@ -20,48 +11,6 @@ export function getRunAt(runAts: string[]): chrome.extensionTypes.RunAt {
2011
return "document_idle";
2112
}
2213

23-
export function mapToObject(map: Map<string, any>): { [key: string]: any } {
24-
const obj: { [key: string]: any } = {};
25-
map.forEach((value, key) => {
26-
if (value instanceof Map) {
27-
obj[key] = mapToObject(value);
28-
} else if (obj[key] instanceof Array) {
29-
obj[key].push(value);
30-
} else {
31-
obj[key] = value;
32-
}
33-
});
34-
return obj;
35-
}
36-
37-
export function objectToMap(obj: { [key: string]: any }): Map<string, any> {
38-
const map = new Map<string, any>();
39-
Object.keys(obj).forEach((key) => {
40-
if (obj[key] instanceof Map) {
41-
map.set(key, objectToMap(obj[key]));
42-
} else if (obj[key] instanceof Array) {
43-
map.set(key, obj[key]);
44-
} else {
45-
map.set(key, obj[key]);
46-
}
47-
});
48-
return map;
49-
}
50-
51-
export function arrayToObject(arr: Array<any>): any[] {
52-
const obj: any[] = [];
53-
arr.forEach((item) => {
54-
if (item instanceof Map) {
55-
obj.push(mapToObject(item));
56-
} else if (item instanceof Array) {
57-
obj.push(arrayToObject(item));
58-
} else {
59-
obj.push(item);
60-
}
61-
});
62-
return obj;
63-
}
64-
6514
// 检查是不是base64编码
6615
export function isBase64(str: string): boolean {
6716
if (typeof str !== "string" || str.length === 0) {

src/locales/locales.ts

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -81,32 +81,33 @@ export function isChineseUser() {
8181
}
8282

8383
// 匹配语言
84-
export async function matchLanguage() {
85-
const acceptLanguages = await chrome.i18n.getAcceptLanguages();
86-
// 遍历数组寻找匹配语言
87-
for (let i = 0; i < acceptLanguages.length; i += 1) {
88-
const lng = acceptLanguages[i];
89-
if (i18n.hasResourceBundle(lng, "translation")) {
90-
return lng;
84+
export function matchLanguage(): Promise<string> {
85+
return chrome.i18n.getAcceptLanguages().then((acceptLanguages) => {
86+
// 遍历数组寻找匹配语言
87+
for (let i = 0; i < acceptLanguages.length; i += 1) {
88+
const lng = acceptLanguages[i];
89+
if (i18n.hasResourceBundle(lng, "translation")) {
90+
return lng;
91+
}
9192
}
92-
}
93-
// 根据前缀去匹配
94-
const prefixMap = {} as Partial<Record<string, string[]>>;
95-
for (const lng of i18n.languages) {
96-
const prefix = lng.split("-")[0];
97-
if (!prefixMap[prefix]) {
98-
prefixMap[prefix] = [];
93+
// 根据前缀去匹配
94+
const prefixMap = {} as Partial<Record<string, string[]>>;
95+
for (const lng of i18n.languages) {
96+
const prefix = lng.split("-")[0];
97+
if (!prefixMap[prefix]) {
98+
prefixMap[prefix] = [];
99+
}
100+
prefixMap[prefix].push(lng);
99101
}
100-
prefixMap[prefix].push(lng);
101-
}
102-
for (let i = 0; i < acceptLanguages.length; i += 1) {
103-
const lng = acceptLanguages[i];
104-
const prefix = lng.split("-")[0];
105-
if (prefixMap[prefix] && prefixMap[prefix].length > 0) {
106-
return prefixMap[prefix][0]; // 返回第一个匹配的语言
102+
for (let i = 0; i < acceptLanguages.length; i += 1) {
103+
const lng = acceptLanguages[i];
104+
const prefix = lng.split("-")[0];
105+
if (prefixMap[prefix] && prefixMap[prefix].length > 0) {
106+
return prefixMap[prefix][0]; // 返回第一个匹配的语言
107+
}
107108
}
108-
}
109-
return "";
109+
return "";
110+
});
110111
}
111112

112113
export { t };

src/pages/components/CodeEditor/index.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,13 @@ const CodeEditor: React.ForwardRefRenderFunction<{ editor: editor.IStandaloneCod
2525
}));
2626

2727
useEffect(() => {
28-
const loadConfigs = async () => {
29-
const [eslintConfig, enableEslint] = await Promise.all([
30-
systemConfig.getEslintConfig(),
31-
systemConfig.getEnableEslint(),
32-
]);
33-
setEslintConfig(eslintConfig);
34-
setEnableEslint(enableEslint);
28+
const loadConfigs = () => {
29+
Promise.all([systemConfig.getEslintConfig(), systemConfig.getEnableEslint()]).then(
30+
([eslintConfig, enableEslint]) => {
31+
setEslintConfig(eslintConfig);
32+
setEnableEslint(enableEslint);
33+
}
34+
);
3535
};
3636
loadConfigs();
3737
}, []);

0 commit comments

Comments
 (0)