如何在 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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.