Как проверить, ожидает ли обещание
У меня есть такая ситуация, в которой я хотел бы знать, какой статус имеет обещание. Ниже функция start
вызывает только someTest
, если она больше не работает (обещание не ожидается). Функция start
может быть вызвана много раз, но если ее вызывать, пока тесты все еще работают, она не будет ждать и возвращает только 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
});
}
}
Я не могу найти способ просто проверить статус обещания. Что-то вроде this.promise.isPending
было бы хорошо:) Любая помощь была бы оценена!
Ответы
Ответ 1
Вы можете подключить обработчик then
, который устанавливает флаг done
в обещании (или в случае RunTest
, если вы предпочитаете), и проверьте, что:
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;
}
Обратите внимание на пустой обработчик catch()
, это важно для того, чтобы обработчик вызывал независимо от результата обещания.
Возможно, вы захотите обернуть это в функцию, хотя для того, чтобы сохранить код DRY.
Ответ 2
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);