Web Worker中processCandleData仅生成CandleSeriesArray问题排查求助
你遇到的核心问题是PreviousCandlestick.T < candlestick.t条件未触发,导致SmaSeriesArray和CloseValueSeriesArray无数据,而CandleSeriesArray生成正常。以下是几个大概率的原因及对应解决办法:
1. 时间字段大小写不匹配
代码中使用了PreviousCandlestick.T(大写T)和candlestick.t(小写t),如果实际传入的蜡烛数据中时间字段键名不统一(比如全部是小写t或大写T),会导致其中一个字段为undefined,undefined与时间戳比较的结果始终为false,直接跳过后续逻辑。
解决办法:
检查所有输入数据的时间字段键名,统一为相同大小写后修改条件判断:
// 统一使用小写t作为时间字段键名 if (PreviousCandlestick && PreviousCandlestick.t < candlestick.t) { // 收盘价、SMA计算逻辑 }
2. PreviousCandlestick状态未正确维护
Web Worker可维护全局状态,但如果处理preparationChunk(ChunkProcessing=true)后未保留PreviousCandlestick,或切换到ChunkProcessing=false时被意外重置,会导致后续判断时PreviousCandlestick不存在或为初始值。
解决办法:
在Worker全局作用域声明PreviousCandlestick,确保跨chunk处理时状态不丢失,且每次循环后更新为当前蜡烛数据:
// Worker全局作用域,避免被函数内局部变量覆盖 let PreviousCandlestick = null; function processCandleData(data, isChunkProcessing) { // 生成CandleSeriesArray的逻辑... for (const candlestick of data) { if (PreviousCandlestick && PreviousCandlestick.t < candlestick.t) { CloseValueSeriesArray.push(candlestick.c); // SMA计算逻辑... } // 必须更新PreviousCandlestick,无论条件是否触发 PreviousCandlestick = {...candlestick}; // 深拷贝避免引用修改问题 } }
注意:处理preparationChunk(历史数据)后,PreviousCandlestick应指向历史数据的最后一根K线,这样后续处理实时chunk时才能正确触发条件。
3. 时间戳类型不统一
如果PreviousCandlestick.T是ISO字符串(如"2024-01-01T00:00:00Z"),而candlestick.t是Unix时间戳数字(如1704067200000),直接比较会因类型不匹配导致结果不符合预期(ISO字符串转数字会得到NaN,NaN < 任何值均为false)。
解决办法:
统一转换为Unix时间戳数字后再比较:
function convertToTimestamp(time) { if (typeof time === 'string') { return new Date(time).getTime(); } return Number(time); // 确保数字类型,避免字符串形式的时间戳 } // 在条件判断前转换时间格式 const prevTime = convertToTimestamp(PreviousCandlestick.t); const currTime = convertToTimestamp(candlestick.t); if (PreviousCandlestick && prevTime < currTime) { // 收盘价、SMA计算逻辑 }
4. 数据顺序不符合预期
如果传入的chunk数据不是按时间正序排列(比如最新数据在前),会出现candlestick.t小于PreviousCandlestick.t的情况,导致条件无法触发。
解决办法:
处理数据前先按时间正序排序:
function processCandleData(data, isChunkProcessing) { // 按时间戳正序排序数据 const sortedData = [...data].sort((a, b) => { return convertToTimestamp(a.t) - convertToTimestamp(b.t); }); for (const candlestick of sortedData) { // 原有逻辑... } }
内容的提问来源于stack exchange,提问作者Schtraded

