私はこの状況で、約束のステータスが何であるかを知りたいです。以下では、関数start
は、もう実行されていない場合にのみsomeTest
を呼び出します(Promiseは保留されていません)。 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
のようなものがいいでしょう:)どんな助けでも感謝します!
Promiseに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に保つために関数でラップする必要があります。
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);