diff --git a/CHANGELOG.md b/CHANGELOG.md index 144f54c..271a06f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Change Log +## 1.0.6 (2025-02-26) + +Optimize fetch data + ## 1.0.5 (2025-02-06) Optimize fetch data diff --git a/package.json b/package.json index 5b7d548..7200fa9 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "leek-fund-lite", "displayName": "Leek Fund Lite", "description": "A VSCode extension for viewing fund and stock data", - "version": "1.0.5", + "version": "1.0.6", "license": "MIT", "engines": { "vscode": "^1.52.0" diff --git a/src/utils/fetch.ts b/src/utils/fetch.ts index 9f77f7f..65171dc 100644 --- a/src/utils/fetch.ts +++ b/src/utils/fetch.ts @@ -93,16 +93,9 @@ export async function fetchFundData(codes: string[]): Promise { } } -export async function fetchSingleStock( - code: string -): Promise { - if (!code) { - logger.error('Invalid stock code:', code); - return null; - } - +export async function fetchStocks(codes: string[]): Promise { try { - const url = `http://hq.sinajs.cn/list=${code}`; + const url = `http://hq.sinajs.cn/list=${codes.join(',')}`; const response = await fetch(url, { headers: { @@ -116,11 +109,12 @@ export async function fetchSingleStock( const text = iconv.decode(Buffer.from(arrayBuffer), 'GB18030'); if (!text || text.includes('FAILED')) { - logger.error(`Failed to fetch stock ${code} data:`, text); - return null; + logger.error(`Failed to fetch stocks data:`, text); + return []; } const stockList = text.split(';\n').filter(Boolean); + const results: StockData[] = []; for (const stock of stockList) { const [code, data] = stock.split('='); @@ -129,9 +123,11 @@ export async function fetchSingleStock( const stockCode = code.replace('var hq_str_', ''); if (values.length > 1) { + let stockData: StockData | null = null; + if (/^(sh|sz|bj)/.test(stockCode)) { // A-Shares - return { + stockData = { code: stockCode, name: values[0], open: values[1], @@ -145,7 +141,7 @@ export async function fetchSingleStock( }; } else if (/^gb_/.test(stockCode)) { // Hong Kong Stocks - return { + stockData = { code: stockCode, name: values[0], open: values[5], @@ -159,7 +155,7 @@ export async function fetchSingleStock( }; } else if (/^usr_/.test(stockCode)) { // US Stocks - return { + stockData = { code: stockCode, name: values[0], open: values[5], @@ -179,7 +175,7 @@ export async function fetchSingleStock( if (isStockIndexFuture) { // Stock Index Futures - return { + stockData = { code: stockCode, name: values[49].slice(0, -1), open: values[0], @@ -195,7 +191,7 @@ export async function fetchSingleStock( }; } else { // Commodity Futures - return { + stockData = { code: stockCode, name: values[0], open: values[2], @@ -210,7 +206,7 @@ export async function fetchSingleStock( } } else if (/^hf_/.test(stockCode)) { // International Futures - return { + stockData = { code: stockCode, name: values[13], open: values[8], @@ -223,14 +219,19 @@ export async function fetchSingleStock( time: values[6], }; } + + if (stockData) { + results.push(stockData); + } } } } + + return results; } catch (e) { - logger.error(`Failed to fetch stock ${code} data:`, e); + logger.error(`Failed to fetch stocks data:`, e); + return []; } - - return null; } export async function fetchStockData(codes: string[]): Promise { @@ -242,20 +243,10 @@ export async function fetchStockData(codes: string[]): Promise { logger.info('Fetching stock data...'); try { - const limit = pLimit(CONCURRENCY); - - const results = await Promise.allSettled( - codes.map((code) => limit(() => fetchSingleStock(code))) - ); + const results = await fetchStocks(codes); logger.info('Stock data fetched successfully'); - - return results - .filter( - (result): result is PromiseFulfilledResult => - result.status === 'fulfilled' && result.value !== null - ) - .map((result) => result.value); + return results; } catch (error) { logger.error(`Failed to fetch stock data:`, error); return [];