我是可重用代码的粉丝 - 如果你发现自己想要让 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))
]);
现在,结合这两个代码sn-ps
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
不过,在这种情况下,另一个答案更好,我只提供这个答案,以防你发现自己想要为承诺解决方案设置时间限制