如何在 JavaScript 中發出同步 HTTP 請求?


在當前的數字環境中,發出 HTTP 請求是客戶端和伺服器之間傳輸和接收資料的重要組成部分。非同步請求已變得越來越流行,因為它們提供了非阻塞體驗,最終提高了整體使用者體驗。然而,在某些情況下,同步 HTTP 請求可能是必要的或可取的。在接下來的敘述中,我們將深入探討使用 JavaScript 建立同步 HTTP 請求的演算法。我們還將探討兩種不同的方法及其相應的程式碼解釋和實際應用。

演算法

要在 JavaScript 中發起同步 HTTP 請求,必須執行一個包含以下階段的基本演算法:

  • 首先,建立一個 HTTP 請求物件的例項。

  • 其次,透過指定方法、統一資源定位符 (URL) 和將請求設定為同步模式來配置請求。

  • 第三,傳送請求。

  • 第四,等待響應。

  • 最後,相應地處理響應。

方法

使用 XMLHttpRequest

XMLHttpRequest 是 JavaScript 中一個現有的物件,已經使用了一段時間。儘管它已被現代替代方案取代,但它仍然可以有效地用於執行同步 HTTP 請求。以下是如何實現 XMLHttpRequest 的示例:

function synchronousRequest(url) {
   const xhr = new XMLHttpRequest();
   xhr.open('GET', url, false);
   xhr.send(null);
   if (xhr.status === 200) {
      return xhr.responseText;
   } else {
      throw new Error('Request failed: ' + xhr.statusText);
   }
}

在此示例中,我們首先建立一個新的 XMLHttpRequest 例項。接下來,我們呼叫 open() 方法來配置請求。第一個引數是 HTTP 方法 (GET),第二個引數是 URL,第三個引數是一個布林值,指示請求是否應為非同步 (對於同步請求為 false)。最後,我們使用 send() 方法傳送請求並等待響應。如果狀態為 200 (OK),我們返回響應文字;否則,我們丟擲一個錯誤。

示例

使用前面定義的 synchronousRequest 函式:

try {
   const url = 'https://api.example.com/data';
   const responseData = synchronousRequest(url);
   console.log('Response data:', responseData);
} catch (error) {
   console.error('Error:', error.message);
}

在此示例中,我們使用一個示例 URL 呼叫 synchronousRequest 函式。如果請求成功,我們將響應資料記錄到控制檯。但是,如果失敗,我們將錯誤訊息記錄到控制檯。

使用 Fetch API

Fetch API 是 XMLHttpRequest 的現代替代方案,旨在提供更高的靈活性和易用性。不幸的是,本機 fetch() 函式不支援同步請求。但是,您可以使用 async/await 建立類似同步的行為:

async function synchronousFetch(url) {
   const response = await fetch(url);
   if (response.ok) {
      const data = await response.text();
      return data;
   } else {
      throw new Error('Request failed: ' + response.statusText);
   }
}

在此示例中,我們使用 fetch() 函式,它返回一個 Promise。我們使用 await 關鍵字暫停執行,直到 Promise 完成,然後再繼續執行下一行程式碼。如果響應成功,我們檢索響應文字;否則,我們觸發一個錯誤。

示例

使用前面定義的 synchronousFetch 函式:

import React, { useEffect, useState } from "react";
import "./styles.css";
export default function App() {
   const [responseData, setResponseData] = useState(null);
   useEffect(() => {
      (async () => {
         try {
            const url = "https://jsonplaceholder.typicode.com/todos/1";
            const response = await fetch(url);
            if (!response.ok) {
               throw new Error(`HTTP error! Status: ${response.status}`);
            }
            const data = await response.json();
            setResponseData(data);
         } catch (error) {
            console.error("Error:", error.message);
         }
      })();
   }, []);
   return (
      <div className="App">
         <h1>API Data</h1>
         {responseData ? (
            <pre>{JSON.stringify(responseData, null, 2)}</pre>
         ) : (
            <p>Loading...</p>
         )}
      </div>
   );
}

輸出

API Data
{
   "userId": 1,
   "id": 1,
   "title": "delectus aut autem",
   "completed": false
}

在此示例中,我們在一個 async 函式中呼叫 synchronousFetch 函式以正確處理 await 關鍵字。與前面的示例一樣,如果請求成功,我們將響應資料記錄到控制檯,否則記錄錯誤訊息。

結論

雖然非同步請求通常因其非阻塞特性而受到青睞,但 JavaScript 中的同步 HTTP 請求仍然有其使用場景。我們討論了發出同步 HTTP 請求的演算法,並探討了兩種不同的方法,包括較舊的 XMLHttpRequest 方法和使用 async/await 的更現代的 Fetch API。請記住,應謹慎使用同步請求,因為它們可能會阻塞 JavaScript 程式碼的執行並對使用者體驗產生負面影響。

更新於: 2023年4月17日

7K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告