javascript - sincronas - Cómo verificar si hay una promesa pendiente
promise typescript (2)
Puede adjuntar un controlador que establece una marca de done
en la promesa (o la instancia de RunTest
si lo prefiere) y probar 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;
}
Observe el controlador catch()
vacío, es crucial para que se llame al controlador independientemente del resultado de la promesa. Probablemente quiera envolver eso en una función para mantener el código DRY.
Esta pregunta ya tiene una respuesta aquí:
Tengo esta situación en la que me gustaría saber cuál es el estado de una promesa. A continuación, la función start
solo llama a someTest
si ya no se está ejecutando (la promesa no está pendiente). La función de start
se puede llamar muchas veces, pero si se llama mientras las pruebas aún se están ejecutando, no se va a esperar y devuelve simplemente 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
});
}
}
No puedo encontrar una manera de simplemente verificar el estado de una promesa. Algo como this.promise.isPending
estaría bien :) ¡Cualquier ayuda sería apreciada!
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);