Sondage pour un résultat n fois (avec des retards entre les tentatives) avant d'échouer

Nous devons écrire une fonction Node.js qui recherche un certain point d'extrémité API pour un résultat d'un calcul demandé précédemment. Le résultat prend un temps aléatoire pour être généré et peut-être pas généré du tout. Nous aimerions l'obtenir le plus tôt possible, mais je ne veux pas attendre trop longtemps, ce qui signifie qu'après un certain nombre d'appels à l'API, nous aimerions que la fonction échoue (rejeter une promesse).

Il existe une communication unique entre notre code et 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'); }); } 

Est-ce la bonne approche?

    Non. Ceci est la version asynchrone / attendue du constructeur Promise antipattern ! Il n'arrêtera même pas la boucle lorsque vous appelez la resolve , ou le rejeter lorsqu'une exception est lancée (par exemple, lorsque res est null ).
    Tu devrais utiliser

     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'); } 

    Si vous souhaitez vous assurer que la promesse Bluebird est retournée, pas native, enveloppez-la dans Bluebird.method ou dites à votre transpiler d'utiliser Bluebird.