1. ホーム
  2. javascript

[解決済み] Fetch APIのリクエストタイムアウト?

2022-04-22 19:49:26

質問

私は fetch-api POST をリクエストしてください。

fetch(url, {
  method: 'POST',
  body: formData,
  credentials: 'include'
})

また、このタイムアウトを3秒や不定秒など特定の値に設定するにはどうすればよいのでしょうか?

解決方法は?

編集1

コメントで指摘されているように、元の答えのコードは、約束が解決/拒否された後でもタイマーを実行し続けています。

以下のコードでその問題を解決します。

function timeout(ms, promise) {
  return new Promise((resolve, reject) => {
    const timer = setTimeout(() => {
      reject(new Error('TIMEOUT'))
    }, ms)

    promise
      .then(value => {
        clearTimeout(timer)
        resolve(value)
      })
      .catch(reason => {
        clearTimeout(timer)
        reject(reason)
      })
  })
}



オリジナル回答

デフォルトの指定はありません。 仕様 は、タイムアウトについて全く議論していません。

一般的なプロミスに対して、独自のタイムアウトラッパーを実装することができます。

// Rough implementation. Untested.
function timeout(ms, promise) {
  return new Promise(function(resolve, reject) {
    setTimeout(function() {
      reject(new Error("timeout"))
    }, ms)
    promise.then(resolve, reject)
  })
}

timeout(1000, fetch('/hello')).then(function(response) {
  // process response
}).catch(function(error) {
  // might be a timeout error
})

で説明したように https://github.com/github/fetch/issues/175 コメント https://github.com/mislav