code optimize

This commit is contained in:
2020-01-17 09:38:40 +08:00
parent 378883b626
commit 63aec616b1
3 changed files with 45 additions and 34 deletions

View File

@ -19,14 +19,14 @@ export function redirectTab(tab: chrome.tabs.Tab, url: string) {
let queryErr: any; let queryErr: any;
let newURL = await queryUrl(tab).catch(e => queryErr = e); let newURL = await queryUrl(tab).catch(e => queryErr = e);
if (queryErr) { if (queryErr) {
return Promise.reject(queryErr); throw queryErr;
} }
if (newURL == url) return url; if (newURL == url) return url;
if ( if (
tryCount % 1 == 0 && tryCount % 1 == 0 &&
!confirm('Cannot navigate to target url. \nPress OK to continue, Cancel to stop.') !confirm('Cannot navigate to target url. \nPress OK to continue, Cancel to stop.')
) { ) {
return Promise.reject("Tasks stopped by user."); throw "Tasks stopped by user.";
} }
return undefined; return undefined;
} }

View File

@ -50,46 +50,57 @@ export function sendMessage<T>(
chrome.tabs.sendMessage(tab.id, req, async (r: Response<T>) => { chrome.tabs.sendMessage(tab.id, req, async (r: Response<T>) => {
// check error but do nothing until dataChecker. // check error but do nothing until dataChecker.
let err = chrome.runtime.lastError; let err = chrome.runtime.lastError;
let result: T; let [result, error] = await checkResponse(dataChecker, r, err, count);
// r could be undefined if the content script is interrupted. if (error) {
if (r) {
result = r.result;
if (dataChecker) {
let pms: T | Promise<T>;
try {
pms = dataChecker(r, err, count);
} catch (error) {
reject(error); reject(error);
return; return;
} }
let flag = result !== undefined;
if (log) logger.info(log, flag ? '(OK)' : '(failed)');
if (flag) {
resolve(result);
} else {
setTimeout(() => {
logger.debug('Invalid response', r, 'retry...');
loop();
}, interval);
}
});
}
});
}
async function checkResponse<T>(
dataChecker: ResponseChecker<T>,
response: Response<T>,
error: chrome.runtime.LastError,
tryCount: number
): Promise<[T, string]> {
// response could be undefined if the content script is interrupted.
// don't check, tell sendMessage to retry.
if (!response) return [undefined, undefined];
if (!dataChecker) {
return [response.result, response.error];
}
let result: T;
let pms: T | Promise<T>;
try {
pms = dataChecker(response, error, tryCount);
} catch (err) {
return [undefined, err];
}
// don't catch if it's not a Promise // don't catch if it's not a Promise
if (pms instanceof Promise) { if (pms instanceof Promise) {
let checkerError: any; let checkerError: any;
pms = pms.catch(e => checkerError = e); pms = pms.catch(e => checkerError = e);
result = await pms; result = await pms;
if (checkerError) { if (checkerError) {
reject(checkerError); return [undefined, checkerError];
return;
} }
} else { } else {
result = pms; result = pms;
} }
} return [result, undefined];
}
let flag = result !== undefined && result !== null;
if (log) logger.info(log, flag ? '(OK)' : '(failed)');
if (flag) {
resolve(result);
} else {
setTimeout(() => {
loop();
}, interval);
}
});
}
});
} }
export type ActionSubscriberSync = (request: Request, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void) => void; export type ActionSubscriberSync = (request: Request, sender: chrome.runtime.MessageSender, sendResponse: (response?: any) => void) => void;

View File

@ -103,8 +103,8 @@ export class Task {
messageSubscribers.addListener(Actions.REPORT_NEW_PAGE, listener); messageSubscribers.addListener(Actions.REPORT_NEW_PAGE, listener);
} }
async execute(tab: chrome.tabs.Tab, upstreamData?: ExtractResult): Promise<void> { async execute(tab: chrome.tabs.Tab, upstreamData?: ExtractResult): Promise<void> {
if (!tab) return Promise.reject("No tab to execute the task."); if (!tab) throw "No tab to execute the task.";
if (this._running) return Promise.reject("The task is running. Please wait..."); if (this._running) throw "The task is running. Please wait...";
this._running = true; this._running = true;
let urls = this._urls let urls = this._urls
if (!urls.length) { if (!urls.length) {
@ -140,7 +140,7 @@ export class Task {
).catch( ).catch(
e => { e => {
this._running = false; this._running = false;
return Promise.reject(e); throw e;
} }
); );
} }
@ -152,7 +152,7 @@ export class Task {
return pm; return pm;
} }
private runningCheck(fn: () => Promise<any>): Promise<any> { private runningCheck(fn: () => Promise<any>): Promise<any> {
if (!this._running) return Promise.reject("The task is stopped by user."); if (!this._running) throw "The task is stopped by user.";
return fn(); return fn();
} }
private saveResult(results, key) { private saveResult(results, key) {