Прежде всего, вы никогда не должны использовать setInterval
в том случае, если вы хотите повторить задачу, которая не удалась.Вместо этого следует использовать setTimeout
.
Кроме того, вы не можете вернуть значение из классической базовой функции обратного вызова, такой как setInterval
или setTimeout
.Таким образом, в его текущей форме обещание, возвращаемое при вызове open
, будет разрешено до установления любого соединения.
С помощью await
/ async
вы можете создать простую и понятную настройку для такой ситуации:
function wait(seconds) {
return new Promise((resolve, _) => setTimeout(resolve, seconds))
}
async function connect() {
throw new Error('failed')
}
async function open(config) {
let client;
while (client === undefined /* || retries > maxRetries*/ ) {
try {
client = await connect(config);
} catch (err) {
// if connection failed due to an error, wait n seconds and retry
console.log('failed wait 2 seconds for reconnect');
await wait(2000)
// ++retries
}
}
if (!client) {
throw new Error('connection failed due to max number of retries reached.')
}
return client
}
async function main() {
let connection = await open()
}
main().catch(err => console.log(err))
Вы можете расширить этот фрагмент, добавив предел повторных попыток.См. Комментарии для приблизительного представления о том, как этого можно достичь.
Чтобы протестировать приведенный выше код, вы должны написать:
it("###test", function() {
return open(config);
});