J'ai cette situation dans laquelle j'aimerais savoir quel est le statut d'une promesse. Ci-dessous, la fonction start
appelle uniquement someTest
si elle ne s'exécute plus (la promesse n'est pas en attente). La fonction start
peut être appelée plusieurs fois, mais si elle est appelée alors que les tests sont toujours en cours d'exécution, elle ne va pas attendre et renvoie simplement false
class RunTest {
start() {
retVal = false;
if (!this.promise) {
this.promise = this.someTest();
retVal = true;
}
if ( /* if promise is resolved/rejected or not pending */ ) {
this.promise = this.someTest();
retVal = true;
}
return retVal;
}
someTest() {
return new Promise((resolve, reject) => {
// some tests go inhere
});
}
}
Je ne peux pas trouver un moyen de vérifier simplement le statut d'une promesse. Quelque chose comme this.promise.isPending
serait bien :) Toute aide serait appréciée!
Vous pouvez attacher un gestionnaire then
qui définit un indicateur done
sur la promesse (ou l'instance RunTest
si vous préférez), et vérifiez que:
if (!this.promise) {
this.promise = this.someTest();
this.promise.catch(() => {}).then(() => { this.promise.done = true; });
retVal = true;
}
if ( this.promise.done ) {
this.promise = this.someTest();
this.promise.catch(() => {}).then(() => { this.promise.done = true; });
retVal = true;
}
Remarquez le gestionnaire vide catch()
, il est crucial de pouvoir appeler le gestionnaire quel que soit le résultat de la promesse. Vous voudrez probablement inclure cela dans une fonction afin de garder le code au sec.
class RunTest {
constructor() {
this.isRunning = false;
}
start() {
console.log('isrunning', this.isRunning);
var retVal = false;
if(!this.isRunning) {
this.promise = this.someTest();
this.promise.catch().then(() => { this.isRunning = false; });
retVal = true;
}
return retVal;
}
someTest() {
this.isRunning = true;
return new Promise((resolve, reject) => {
setTimeout(function() {
//some tests go inhere
resolve();
}, 1000);
});
}
};
var x = new RunTest();
x.start(); //logs false
x.start(); //logs true
setTimeout(function() {
//wait for a bit
x.start(); //logs false
}, 2000);