//简便写法
const axios = require('axios');
async function fetchDataWithPolling(url, timeout = 2000, interval = 100) {
let elapsed = 0; // 用于记录已经经过的时间
const sendRequest = async () => {
try {
const response = await axios.get(url); // 发送 HTTP GET 请求
if (response.data) {
return response.data; // 如果请求成功,返回数据
}
} catch (error) {
console.error('Request failed:', error.message); // 如果请求失败,输出错误信息
return null;
}
};
const poll = async () => {
while (elapsed < timeout) {
const requestPromise = sendRequest();
// 等待指定的间隔时间(例如 100ms)
await new Promise(resolve => setTimeout(resolve, interval));
elapsed += interval;
const result = await requestPromise;
if (result) {
return result; // 如果成功获取数据,返回数据
}
}
return null; // 如果在超时时间内未成功获取数据,返回 null
};
return new Promise(async (resolve, reject) => {
const result = await Promise.race([
poll(),
new Promise((_, reject) => setTimeout(() => reject('Failed to receive data within the timeout period.'), timeout))
]);
if (result) {
resolve(result); // 成功获取数据后,resolve Promise 并返回数据
} else {
reject('Failed to receive data within the timeout period.'); // 超时后,reject Promise
}
});
}
// 示例调用
fetchDataWithPolling('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
console.log('Final received data:', data);
})
.catch(error => {
console.error(error);
});
----------------------------------------------------------------------------------------
const axios = require('axios');
async function fetchDataWithPolling(url, timeout = 2000, interval = 100) {
let success = false; // 用于标识是否成功获取数据
let elapsed = 0; // 用于记录已经经过的时间
let pendingRequests = []; // 用于跟踪所有未完成的请求
let resultData = null; // 用于存储成功获取到的数据
const sendRequest = async () => {
try {
const response = await axios.get(url); // 发送 HTTP GET 请求
if (response.data) {
success = true; // 如果请求成功,设置 success 为 true
resultData = response.data; // 存储成功获取到的数据
console.log('Data received:', response.data); // 输出接收到的数据
pendingRequests = []; // 清空所有 pending 请求,避免继续检查
}
} catch (error) {
console.error('Request failed:', error.message); // 如果请求失败,输出错误信息
}
};
return new Promise(async (resolve, reject) => {
while (!success && elapsed < timeout) {
// 发送一个新的请求并添加到 pending 请求列表
const requestPromise = sendRequest();
pendingRequests.push(requestPromise);
// 等待指定的间隔时间(例如 100ms)
await new Promise(resolve => setTimeout(resolve, interval));
elapsed += interval;
// 检查所有 pending 请求的状态
await Promise.all(pendingRequests).then(() => {
if (success) {
// 如果有请求成功,跳出循环
return;
}
});
}
if (success) {
resolve(resultData); // 成功获取数据后,resolve Promise 并返回数据
} else {
reject('Failed to receive data within the timeout period.');
}
});
}
// 示例调用
fetchDataWithPolling('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
console.log('Final received data:', data);
})
.catch(error => {
console.error(error);
});
----------------------------------------------------------------------------------------
const axios = require('axios');
async function fetchDataWithPolling(url, timeout = 2000, interval = 100) {
let success = false; // 用于标识是否成功获取数据
let elapsed = 0; // 用于记录已经经过的时间
let pendingRequests = []; // 用于跟踪所有未完成的请求
let responseData = null; // 用于存储成功获取到的数据
const sendRequest = async () => {
try {
const response = await axios.get(url); // 发送 HTTP GET 请求
if (response.data) {
success = true; // 如果请求成功,设置 success 为 true
responseData = response.data; // 存储成功获取到的数据
console.log('Data received:', responseData); // 输出接收到的数据
pendingRequests = []; // 清空所有 pending 请求,避免继续检查
}
} catch (error) {
console.error('Request failed:', error.message); // 如果请求失败,输出错误信息
}
};
while (!success && elapsed < timeout) {
// 发送一个新的请求并添加到 pending 请求列表
const requestPromise = sendRequest();
pendingRequests.push(requestPromise);
// 等待指定的间隔时间(例如 100ms)
await new Promise(resolve => setTimeout(resolve, interval));
elapsed += interval;
// 检查所有 pending 请求的状态
await Promise.all(pendingRequests).then(() => {
if (success) {
// 如果有请求成功,跳出循环
return;
}
});
}
if (!success) {
console.log('Failed to receive data within the timeout period.');
}
return responseData; // 返回成功获取到的数据或 null
}
// 示例调用
fetchDataWithPolling('https://jsonplaceholder.typicode.com/posts/1')
.then(data => {
if (data) {
console.log('Received data:', data);
} else {
console.log('No data received.');
}
})
.catch(error => {
console.error('Error during polling:', error);
});
-----------------------------------------------------------------------------------------
const axios = require('axios');
async function fetchDataWithTimeout(url, timeout = 2000, interval = 100) {
let success = false; // 用于标识是否成功获取数据
let elapsed = 0; // 用于记录已经经过的时间
let pendingRequests = []; // 用于跟踪所有未完成的请求
// 定义一个异步函数来发送请求
const sendRequest = async () => {
try {
const response = await axios.get(url); // 发送 HTTP GET 请求
if (response.data) {
success = true; // 如果请求成功,设置 success 为 true
console.log('Data received:', response.data); // 输出接收到的数据
pendingRequests = []; // 清空 pendingRequests 数组
}
} catch (error) {
console.error('Request failed:', error.message); // 如果请求失败,输出错误信息
}
};
// 循环直到成功获取数据或达到超时
while (!success && elapsed < timeout) {
const requestPromise = sendRequest(); // 发送一个新的请求并获取 Promise
pendingRequests.push(requestPromise); // 将 Promise 添加到 pendingRequests 数组
await new Promise(resolve => setTimeout(resolve, interval)); // 等待指定的间隔时间(100ms)
elapsed += interval; // 增加已经过的时间
await Promise.all(pendingRequests).then(() => { // 等待所有 pending 请求完成
if (success) {
return; // 如果有请求成功,跳出循环
}
});
}
if (!success) {
console.log('Failed to receive data within the timeout period.'); // 如果超时未成功,输出错误信息
}
}
// 示例调用
fetchDataWithTimeout('https://api.example.com/data');
一个实现案例
于 2024-07-09 23:48:19 首次发布