Я фанат кода многократного использования - если вы хотите тайм-аут для Promise, то почему бы не написать функцию для этого
const promiseTimeout = (promise, timeout) => {
let timer;
return Promise.race([
promise,
new Promise((_, reject) => (timer = setTimeout(reject, timeout, promiseTimeout.symbol)))
])
.then(result => (clearTimeout(timer), result));
};
promiseTimeout.symbol = Symbol('timeout');
Теперь вы можете использовать это где угодно, чтобы установить ограничение по времени для обещания
В этом случае, как уже отмечалось, вам понадобятся два обещания для вашей логики, заключенные в Promise.all, которые получают одно обещание, которое разрешается, когда оба обещания разрешаются
т.е.
const promise = Promise.all([
new Promise(resolve => this._client.on('connected', resolve)),
new Promise(resolve => this._client.on('socketConnected', resolve))
]);
теперь, комбинируя эти два фрагмента кода
const promiseTimeout = (promise, timeout) => {
let timer;
return Promise.race([
promise,
new Promise((_, reject) => (timer = setTimeout(reject, timeout, promiseTimeout.symbol)))
])
.then(result => (clearTimeout(timer), result));
};
promiseTimeout.symbol = Symbol('timeout');
function connect() {
const promise = Promise.all([
new Promise(resolve => this._client.on('connected', resolve)),
new Promise(resolve => this._client.on('socketConnected', resolve))
]);
return promiseTimeout(promise, 5000);
}
// if connect rejects with reason promiseTimeout.symbol, you can be sure it was because of the timeout
Хотя другой ответ лучше в этом случае, я предлагаю его только в том случае, если вы действительно хотите установить ограничение по времени для разрешения обещания