Sondare per un risultato n volte (con ritardi tra i tentativi) prima di fallire

Abbiamo bisogno di scrivere una funzione Node.js che esegue il polling di un determinato endpoint API per un risultato di un calcolo richiesto in precedenza. Il risultato richiede un tempo casuale per essere generato e potrebbe non essere generato. Ci piacerebbe ottenerlo il prima ansible, ma anche io non voglio aspettare troppo a lungo, il che significa che dopo un certo numero di chiamate API vorremmo che la funzione fallisse (rifiutare una promise).

C’è una comunicazione unidirezionale tra il nostro codice e l’API.

const Bluebird = require('bluebird'); function getResult() { return new Bluebird(async function (resolve, reject) { let counter = 0; while (counter < 10) { await Bluebird.delay(1000); const res = await apiCall(); if (res.data) { resolve(res.data); } else { counter += 1; } } reject('timeout'); }); } 

È questo l’approccio corretto?

No. Questa è la versione asincrona / attesa del Promotore antipattern ! Non fermerà nemmeno il ciclo quando chiami resolve , o rifiuta quando viene lanciata un’eccezione (ad esempio quando res è null ).
Dovresti usare

 async function getResult() { for (let counter = 0; counter < 10; counter += 1) { await Bluebird.delay(1000); const res = await apiCall(); if (res.data) { return res.data; } } throw new Error('timeout'); } 

Se vuoi assicurarti che venga restituita una promise Bluebird, non una nativa, avvolgila in Bluebird.method o dica al tuo transpiler di usare Bluebird.