2016-08-15 24 views
6
fetch() { 
    return axios.get('/rest/foo') 
     //.then(response => {throw new Error(response)}) // Uncomment to test network error 
     //.then(<<add delay here>>) // Uncomment to simulate network delay 
} 

遅延を後でブロックに追加するにはどうすればいいですか?指定された時間だけ待機してから、呼び出し元を呼び出してブロックします。遅延を追加して内部に約束する方法

+1

のsetTimeoutを()あなたのためのトリックを行う必要があります。 – Cruiser

+0

"return asyncfunction()。then()"これが有効かどうかわかりませんjs。 –

+1

@Jonasw:はい、そうです。 –

答えて

25

戻り待機thenハンドラからの約束:

.then(() => new Promise(resolve => setTimeout(resolve, 1000))) 

をあなたが書く、どこでもこの決まり文句を避けるために

そして、約束の値
.then(x => new Promise(resolve => setTimeout(() => resolve(x), 1000))) 

を「通過」したい場合ユーティリティ機能:

function sleeper(ms) { 
    return function(x) { 
    return new Promise(resolve => setTimeout(() => resolve(x), ms)); 
    }; 
} 

.then(sleeper(1000)).then(...) 
0

これは、あなたが新しい約束を作成まれな状況の一つである:それはvalueは約束である可能性があります場合は、チェーン内の.then(value => Promise.resolve(value))を挿入

fetch() { 
    return axios.get('/rest/foo') 
     .then(value => new Promise(resolve => { 
       setTimeout(() => { 
        resolve(value); 
       }, delayInMilliseconds); 
      }) 
     ); 
} 

を:

fetch() { 
    return axios.get('/rest/foo') 
     .then(value => Promise.resolve(value))  // *** 
     .then(value => new Promise(resolve => { 
       setTimeout(() => { 
        resolve(value); 
       }, delayInMilliseconds); 
      }) 
     ); 
} 
+0

この構文について不思議そうです、それは機能しますか? 'value => Promise.resolve(value)=>新しいPromise'。それ以前にドットが抜けています。とにかく、 'value'が特別なことをせずに約束しているケースを'解決する 'ことはありませんか? –

+0

@torazaburo:タイプミス(両方とも)を指摘してくれてありがとう。再解決:前回の約束が解決されてから遅延を開始すると思った。私たちがそれを待たなければ、私たちのタイムアウトは他の仕事と並行して実行されますが、約束は未だ不安定です。 –

関連する問題