web-dev-qa-db-ja.com

その中に約束するために遅延を追加する方法

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
}

後者のブロックに遅延を追加するにはどうすればいいですか?フェッチ呼び出し元に制御を渡してブロックする前に指定された時間待機しますか?

38
Tuomas Toivonen

待機する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(...)
88
user663031

これは、新しいプロミスを作成するまれな状況の1つです。

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

valueがプロミスである可能性がある場合、チェーンに.then(value => Promise.resolve(value))を挿入します。

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