Promise.race
может разрешиться, как только ваше redis.get
будет завершено, но обещания не могут быть отменены, поэтому обещание тайм-аута продолжает существовать до тех пор, пока не будет решено или отклонено.
Возможно, вы могли бы сделать что-то вродеthis?
const util = require('util');
const setTimeoutPromise = util.promisify(setTimeout);
const redis = ...;
function get(key) {
return timeout(redis.get(key).then(JSON.parse), 900000);
}
function timeout(promise, timeoutMs) {
return new Promise((resolve, reject) => {
const timeout = setTimeout(() => {
reject('GET took too long');
}, timeoutMs);
promise.then((...args) => {
resolve(...args);
}).catch((err) => {
reject(err);
}).then(() => {
clearTimeout(timeout);
});
});
}
Вы могли бы получить ошибку о resolve
введении или reject
выполнении обещания дважды в случае, если get
действительно истекает, но это несколько неизбежно, потому что обещания могут 'не подлежит отмене.