javascript - إحضار مهلة طلب API؟




ajax fetch-api (5)

لدي طلب fetch-api POST :

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

أريد أن أعرف ما هي المهلة الافتراضية لهذا؟ وكيف يمكننا ضبطه على قيمة معينة مثل 3 ثوان أو ثانية غير محددة؟


أنا حقا أحب النهج النظيف من هذا Promise.race باستخدام Promise.race

fetchWithTimeout.js

export default function (url, options, timeout = 7000) {
    return Promise.race([
        fetch(url, options),
        new Promise((_, reject) =>
            setTimeout(() => reject(new Error('timeout')), timeout)
        )
    ]);
}

main.js

import fetch from './fetchWithTimeout'

// call as usual or with timeout as 3rd argument

fetch('http://google.com', options, 5000) // throw after max 5 seconds timeout error
.then((result) => {
    // handle result
})
.catch((e) => {
    // handle errors and timeout error
})

باستخدام بناء جملة الإجهاض ، ستتمكن من القيام بما يلي:

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

انظر AbortController الصفحة على MDN.


لا يوجد دعم مهلة في واجهة برمجة تطبيقات جلب المعلومات حتى الآن. ولكن يمكن تحقيق ذلك من خلال لفه في وعد.

على سبيل المثال

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

يمكنك إنشاء مجمّع timeoutPromise

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

يمكنك ثم التفاف أي وعد

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

لن يلغي اتصالًا أساسيًا ولكنه سيسمح لك بمهلة الوعد.
Reference


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






fetch-api