web-dev-qa-db-fra.com

Comment ajouter un délai pour promettre à l'intérieur puis

fetch() {   
    return axios.get('/rest/foo')
        //.then(response => {throw new Error(response)}) // Uncomment to test network error
        //.then( <<add delay here>> ) // Uncomment to simulate network delay
}

Comment puis-je ajouter un délai dans le dernier bloc, afin d'attendre le temps spécifié avant de passer le contrôle aux appelants d'extraction puis aux blocs?

38
Tuomas Toivonen

Retourne une promesse du gestionnaire then qui attend:

.then(() => new Promise(resolve => setTimeout(resolve, 1000)))

Si vous voulez "transmettre" la valeur de la promesse, alors

.then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000)))

Pour éviter cette passe partout, écrivez une fonction utilitaire:

function sleeper(ms) {
  return function(x) {
    return new Promise(resolve => setTimeout(() => resolve(x), ms));
  };
}

puis utilisez-le comme dans

.then(sleeper(1000)).then(...)
88
user663031

C'est l'une des rares situations où vous créez une nouvelle promesse:

fetch() {   
    return axios.get('/rest/foo')
        .then(value => new Promise(resolve => {
                setTimeout(() => {
                    resolve(value);
                }, delayInMilliseconds);
            })
        );
}

S'il est possible que value soit une promesse, insérez .then(value => Promise.resolve(value)) dans la chaîne:

fetch() {   
    return axios.get('/rest/foo')
        .then(value => Promise.resolve(value))     // ***
        .then(value => new Promise(resolve => {
                setTimeout(() => {
                    resolve(value);
                }, delayInMilliseconds);
            })
        );
}
2
T.J. Crowder