Heim > Web-Frontend > js-Tutorial > Wie kann ich native XHR-Anfragen mithilfe von JavaScript versprechen?

Wie kann ich native XHR-Anfragen mithilfe von JavaScript versprechen?

DDD
Freigeben: 2024-12-06 06:31:12
Original
1048 Leute haben es durchsucht

How to Promisify Native XHR Requests Using JavaScript?

Wie man natives Während viele Frameworks integrierte Mechanismen zur Versprechensbereitstellung bieten, ist es möglich, diese Funktionalität auch mit nativem Code zu erreichen. In dieser Anleitung wird gezeigt, wie Sie native XHR-Anfragen (XMLHttpRequest) in Versprechen umwandeln.

Schritt 1: Definieren Sie eine Anforderungsfunktion mit Rückrufen

Beginnen Sie mit der Erstellung einer grundlegenden XHR-Anfragefunktion, die Rückrufe verwendet:

Schritt 2: Einführung der Promise-Konstruktion

Um dies zu transformieren Funktion in eine versprochene Version umwandeln, nutzen Sie den Promise-Konstruktor:
function makeRequest(method, url, done) {
  var xhr = new XMLHttpRequest();
  xhr.open(method, url);
  xhr.onload = function () {
    done(null, xhr.response);
  };
  xhr.onerror = function () {
    done(xhr.response);
  };
  xhr.send();
}
Nach dem Login kopieren

Schritt 3: Erweitern mit Parametern und Optionen

Um die Flexibilität der Anforderungsfunktion zu verbessern, führen Sie Parameter für Methode, URL, und ein optionales Optionsobjekt:
function makeRequest(method, url) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open(method, url);
    xhr.onload = function () {
      if (xhr.status >= 200 && xhr.status < 300) {
        resolve(xhr.response);
      } else {
        reject({
          status: xhr.status,
          statusText: xhr.statusText
        });
      }
    };
    xhr.onerror = function () {
      reject({
        status: xhr.status,
        statusText: xhr.statusText
      });
    };
    xhr.send();
  });
}
Nach dem Login kopieren

Verwendung

Mit der versprochenen makeRequest-Funktion, XHRs können nahtlos als asynchrone Vorgänge ausgeführt werden:
function makeRequest(opts) {
  return new Promise(function (resolve, reject) {
    var xhr = new XMLHttpRequest();
    xhr.open(opts.method, opts.url);
    xhr.onload = function () {
      if (xhr.status >= 200 && xhr.status < 300) {
        resolve(xhr.response);
      } else {
        reject({
          status: xhr.status,
          statusText: xhr.statusText
        });
      }
    };
    xhr.onerror = function () {
      reject({
        status: xhr.status,
        statusText: xhr.statusText
      });
    };
    if (opts.headers) {
      Object.keys(opts.headers).forEach(function (key) {
        xhr.setRequestHeader(key, opts.headers[key]);
      });
    }
    var params = opts.params;
    if (params && typeof params === 'object') {
      params = Object.keys(params).map(function (key) {
        return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
      }).join('&');
    }
    xhr.send(params);
  });
}
Nach dem Login kopieren

Alternativer Ansatz

Eine Alternative zur Promisifizierung ist die Verwendung der Fetch-API, die integrierte Unterstützung für Versprechen bietet. Beachten Sie jedoch, dass der Abruf möglicherweise nicht in allen Browsern unterstützt wird und möglicherweise eine Polyfüllung erfordert.
makeRequest({
  method: 'GET',
  url: 'http://example.com'
})
.then(function (datums) {
  return makeRequest({
    method: 'POST',
    url: datums.url,
    params: {
      score: 9001
    },
    headers: {
      'X-Subliminal-Message': 'Upvote-this-answer'
    }
  });
})
.catch(function (err) {
  console.error('Augh, there was an error!', err.statusText);
});
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich native XHR-Anfragen mithilfe von JavaScript versprechen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage