2016-12-02 9 views
0

データを取得する必要があり、時間がかかることがあります。 100ミリ秒以上かかると、ローダーを見せたい。 (私は長いフェッチプロセスをテストしたかったので)これはsetTimeoutと約束

sleep(ms) { 
    var unixtime_ms = new Date().getTime(); 
    while(new Date().getTime() < unixtime_ms + ms) {} 
} 

などの機能が含まれています原因私は5秒間

fetchOptions(value, page = 0){ 
    return new Promise((resolve, reject) => { ... }); 
} 

getOptions(text, page = 0) { 
    if (this.requestTimeout) clearTimeout(this.requestTimeout); 
    this.requestTimeout = setTimeout((()=>{ 
     console.log("!!"); 
    }), 100); 

this.fetchOptions(text, page) 
     .then(data => { 
     //do something 
     //if (this.requestTimeout) clearTimeout(this.requestTimeout); 
     }) 
     .catch(e => console.log(e)); 
} 

fetchOptions作品をやったことです。

結果としてconsole.logは、約束が解決された後にのみ呼び出されます。なぜそれが起こるのか、この問題を解決する方法を理解するためには本当に助けが必要です

+2

'しばらく(新しいDate()。getTime() tcooc

+0

@tcoocが正しいです。あなたは、スリープ方法のタイムアウトで解決を伴う約束を使用することをお勧めします。 このようにしてください:sleep(ms){新しい解決策を返す(解決、拒否)=> {setTimeout(resolve、5000);})} – dejakob

+0

ありがとう、それは意味をなさない。今本当に愚かな感じ: –

答えて

0

CSSはオプションですか?すぐにクラスを設定し、アニメーションを使用して効果を遅らせることができます。

document.querySelector('button').addEventListener(
 
    'click', 
 
() => document.querySelector('div').classList.toggle('effect'), 
 
    false);
.effect { 
 
    background-color:red; 
 
    animation: effect 500ms forwards; 
 
    border:1px solid black; 
 
    } 
 

 
@keyframes effect { 
 
    0% {background-color:transparent;} 
 
    99% { background-color:transparent; } 
 
    100% {background-color:red;} 
 
}
<button type='button'>Toggle Class</button> 
 
<div>result</div>

+0

提案ありがとう。私はそれが私の特別なケースでは大きな頭痛になるのではないかと心配ですが、それは本当に美しいアイデアです! –