javascript - from - vue js fetch api




Zeitlimit für API-Anforderung abrufen? (5)

Es gibt keinen festgelegten Standardwert. In der Spezifikation werden Timeouts überhaupt nicht behandelt.

Sie können Ihren eigenen Timeout-Wrapper für Versprechungen im Allgemeinen implementieren:

// 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
})

Wie in https://github.com/github/fetch/issues/175 Kommentar von https://github.com/mislav

Ich habe eine fetch-api POST Anfrage:

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

Ich möchte wissen, wie hoch das Standardzeitlimit dafür ist. und wie können wir es auf einen bestimmten Wert wie 3 Sekunden oder unbestimmte Sekunden einstellen?


Es gibt noch keine Timeout-Unterstützung in der Fetch-API. Aber es könnte erreicht werden, indem man es in ein Versprechen hüllt.

für zB.

  function fetchWrapper(url, options, timeout) {
    return new Promise((resolve, reject) => {
      fetch(url, options).then(resolve, reject);

      if (timeout) {
        const e = new Error("Connection timed out");
        setTimeout(reject, timeout, e);
      }
    });
  }

Mit der Abbruch-Syntax können Sie Folgendes tun:

const controller = new AbortController();
const signal = controller.signal;

const fetchPromise = fetch(url, {signal});

// 5 second timeout:
const timeoutId = setTimeout(() => controller.abort(), 5000);


fetchPromise.then(response => {
  // completed request before timeout fired

  // If you only wanted to timeout the request, not the response, add:
  // clearTimeout(timeoutId);
})

Siehe AbortController Seite auf MDN.


Sie können einen timeoutPromise-Wrapper erstellen

function timeoutPromise(timeout, err, promise) {
  return new Promise(function(resolve,reject) {
    promise.then(resolve,reject);
    setTimeout(reject.bind(null,err), timeout);
  });
}

Sie können dann jedes Versprechen einpacken

timeoutPromise(100, new Error('Timed Out!'), fetch(...))
  .then(...)
  .catch(...)  

Eine zugrunde liegende Verbindung wird nicht gekündigt, Sie können jedoch eine Zeitüberschreitung für ein Versprechen festlegen.
Reference


  fetchTimeout (url,options,timeout=3000) {
    return new Promise( (resolve, reject) => {
      fetch(url, options)
      .then(resolve,reject)
      setTimeout(reject,timeout);
    })
  }




fetch-api