w3schools una sincronas promises promesas promesa nodejs hacer funciones como javascript promise ecmascript-6 es6-promise

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