mirror of
https://github.com/puppeteer/puppeteer
synced 2024-06-14 14:02:48 +00:00
chore: simplify waitWithTimeout (#10278)
This commit is contained in:
parent
6f8ea5764d
commit
6923c6b3de
@ -22,14 +22,13 @@ import type {ElementHandle} from '../api/ElementHandle.js';
|
|||||||
import type {JSHandle} from '../api/JSHandle.js';
|
import type {JSHandle} from '../api/JSHandle.js';
|
||||||
import {Page} from '../api/Page.js';
|
import {Page} from '../api/Page.js';
|
||||||
import {isNode} from '../environment.js';
|
import {isNode} from '../environment.js';
|
||||||
import {createDeferred} from '../puppeteer-core.js';
|
|
||||||
import {assert} from '../util/assert.js';
|
import {assert} from '../util/assert.js';
|
||||||
|
import {createDeferred} from '../util/Deferred.js';
|
||||||
import {isErrorLike} from '../util/ErrorLike.js';
|
import {isErrorLike} from '../util/ErrorLike.js';
|
||||||
|
|
||||||
import type {CDPSession} from './Connection.js';
|
import type {CDPSession} from './Connection.js';
|
||||||
import {debug} from './Debug.js';
|
import {debug} from './Debug.js';
|
||||||
import {CDPElementHandle} from './ElementHandle.js';
|
import {CDPElementHandle} from './ElementHandle.js';
|
||||||
import {TimeoutError} from './Errors.js';
|
|
||||||
import type {CommonEventEmitter} from './EventEmitter.js';
|
import type {CommonEventEmitter} from './EventEmitter.js';
|
||||||
import type {ExecutionContext} from './ExecutionContext.js';
|
import type {ExecutionContext} from './ExecutionContext.js';
|
||||||
import {CDPJSHandle} from './JSHandle.js';
|
import {CDPJSHandle} from './JSHandle.js';
|
||||||
@ -392,19 +391,23 @@ export async function waitForEvent<T>(
|
|||||||
deferred.resolve(event);
|
deferred.resolve(event);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return Promise.race([deferred.valueOrThrow(), abortPromise]).then(
|
return Promise.race([deferred.valueOrThrow(), abortPromise])
|
||||||
r => {
|
.then(
|
||||||
removeEventListeners([listener]);
|
r => {
|
||||||
if (isErrorLike(r)) {
|
removeEventListeners([listener]);
|
||||||
throw r;
|
if (isErrorLike(r)) {
|
||||||
|
throw r;
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
removeEventListeners([listener]);
|
||||||
|
throw error;
|
||||||
}
|
}
|
||||||
return r;
|
)
|
||||||
},
|
.finally(() => {
|
||||||
error => {
|
deferred.reject(new Error('Cleared'));
|
||||||
removeEventListeners([listener]);
|
});
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -506,26 +509,14 @@ export async function waitWithTimeout<T>(
|
|||||||
taskName: string,
|
taskName: string,
|
||||||
timeout: number
|
timeout: number
|
||||||
): Promise<T> {
|
): Promise<T> {
|
||||||
let reject: (reason?: Error) => void;
|
const deferred = createDeferred<never>({
|
||||||
const timeoutError = new TimeoutError(
|
message: `waiting for ${taskName} failed: timeout ${timeout}ms exceeded`,
|
||||||
`waiting for ${taskName} failed: timeout ${timeout}ms exceeded`
|
timeout,
|
||||||
);
|
});
|
||||||
const timeoutPromise = new Promise<never>((_, rej) => {
|
|
||||||
return (reject = rej);
|
return await Promise.race([promise, deferred.valueOrThrow()]).finally(() => {
|
||||||
|
deferred.reject(new Error('Cleared'));
|
||||||
});
|
});
|
||||||
let timeoutTimer = null;
|
|
||||||
if (timeout) {
|
|
||||||
timeoutTimer = setTimeout(() => {
|
|
||||||
return reject(timeoutError);
|
|
||||||
}, timeout);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
return await Promise.race([promise, timeoutPromise]);
|
|
||||||
} finally {
|
|
||||||
if (timeoutTimer) {
|
|
||||||
clearTimeout(timeoutTimer);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
Loading…
Reference in New Issue
Block a user