Мой вопрос/ожидание состоит в том, чтобы найти возможную точку или утверждение, которое может вызвать такие проблемы. Если вы сталкивались с чем-то подобным в JS, где он проходит всю функцию, но рассчитывает только одну часть, и у вас есть решение, которое все равно поможет?
В настоящее время я исправляю кое-что в своем коде своего веб-воркера и что-то сломал, но ошибка не выдается. Странно то, что он выполняет лишь небольшую часть вычислений (только то, что нужно для CandleSeriesArray). Я понятия не имею, что делать, поскольку отправляемые данные регистрируются правильно, что также подтверждается CandleSeriesArray:
Сначала некоторая информация о том, как работает код, часть с расчетами приведена ниже: В рабочем файле — рабочий прием и отправка
let testCounter = 0;
let counter2 = 0;
let preparationCounter = 0;
//worker.postMessage({chunk: chunk, index: i, preparationChunk: preparationChunk, changer: changer});
self.onmessage = function (e) {
const { chunk, index, preparationChunk, changer } = e.data;
preparationChunk.forEach(line => {
//var message = line;//JSON.parse(line);
if (line.m === false) {
processCandleData(line.E, line, false, changer)
};
preparationCounter++;
});
// Iterate over each line and parse as JSON
chunk.forEach(line => {
//var message = line;//JSON.parse(line);
if (line.m === false) {
calculateKline = processCandleData(line.E, line, true, changer)
testCounter++;
};
counter2++;
});
// Send the processed result back to the main script
self.postMessage({ index: index, result: calculateKline, counter: counter2, preparationCounter: preparationCounter , testCounter: testCounter });
};
Сначала были получены данные:
worker.postMessage({chunk: chunk, index: i, preparationChunk: preparationChunk, changer: changer});
chunk — это массив, состоящий из множества строк в этом формате, то же самое и дляpreparationChunk. Затем это отправляется в функцию processCandleData(line.E, line, false, changer), строка является заполнителем для обоих блоков данных.
{m: false, E: 1716823048658, k: {…}}
1. E: 1716823048658
2. k:
1. T: 1716823079999
2. c: "69968"
3. i: "1m"
4. o: 69968
5. s: "BTCFUSDT"
6. t: 1716823020000
3. m: false
индекс — номер воркера, чейнджер имеет значение 5 и нужен для расчета значения SMA в функцииprocessCandleData под комментарием: //Обновляем данные для серии SMA
следующая часть:
self.postMessage({ index: index, result: calculateKline, counter: counter2, preparationCounter: preparationCounter , testCounter: testCounter
отправляет его обратно в основной результат скрипта: CalculKline выглядит в консоли следующим образом (результат после завершения работы двух рабочих):
{CandleSeriesArray: Array(26034), SmaSeriesArray: Array(0), CloseValueSeriesArray: Array(0)}
{CandleSeriesArray: Array(26842), SmaSeriesArray: Array(0), CloseValueSeriesArray: Array(1)}
Это показывает, что массивы для SmaSeriesArray и CloseValueSeriesArray отсутствуют. На самом деле это должно выглядеть примерно так: (цифры выдуманы)
{CandleSeriesArray: Array(26034), SmaSeriesArray: Array(10304), CloseValueSeriesArray: Array(234)}
{CandleSeriesArray: Array(26842), SmaSeriesArray: Array(10604), CloseValueSeriesArray: Array(236)}
это делается с помощью возврата ProcessCandleData, который затем находится в значении результата обратного сообщения работника.
Сначала я хотел проверить одну из двух функций вызова, которые не работают. Первая часть работает нормально:
if (ChunkProcessing === true) { // === true not needed but it's there for clarity
const CandleSeries = createCandleSeries(candlestick);
CandleSeriesArray.push(CandleSeries);
}
Но эта часть if (PreviousCandlestick && PreviousCandlestick.T < candlestick.t) (расположенная примерно в строке 39) не работает, но она должна быть истинной, поскольку определена Предыдущая свеча, а T всегда является меткой времени полной минуты, когда t больше этой минуты, тогда утверждение истинно. Моих данных хватит на несколько часов, а это означает, что в какой-то момент они должны быть выше, чем за предыдущую полную минуту.
комбинированныйMessageArrayLength: (5)
[26034, 37019, 36698, 41044, 37896]
Расчет
// I do not know if those are all arrays in the function, but in my code all arrays are defined
let CandleSeriesArray = [];
let SmaSeriesArray = [];
let CloseValueSeriesArray = [];
let MessageArray = [];
let LastCandlestickArray = [];
let closeValuesArray = [];
//-- CALCULATION --//
function createCandleSeries(candlestick) {
return {
time: candlestick.t / 1000,
open: candlestick.o,
high: candlestick.h,
low: candlestick.l,
close: candlestick.c
};};
function createCloseValueSeries(LastCandlestick, CloseValue) {
return {
time: LastCandlestick.t / 1000,
value: CloseValue
};};
function createSmaSeries(LastCandlestick, SMA, colorSMA) {
return {
time: LastCandlestick.t / 1000,
value: SMA,
color: colorSMA
};};
function processCandleData(ActualTimestamp, message, ChunkProcessing, changer) {
var candlestick = message.k
if (ChunkProcessing === true) { // === true not needed but it's there for clarity
const CandleSeries = createCandleSeries(candlestick);
CandleSeriesArray.push(CandleSeries);
}
//return processedCandleData = processCandleData(klineData)
//CLOSEVALUE OF CANDLESTICK
MessageArray.push(candlestick)
let PreviousCandlestick = undefined;
if (MessageArray.length >= 2) {
PreviousCandlestick = MessageArray[MessageArray.length - 2]
};
if (PreviousCandlestick && PreviousCandlestick.T < candlestick.t) {
LastCandlestickArray.push(PreviousCandlestick)
LastCandlestick = LastCandlestickArray[LastCandlestickArray.length - 1];
CloseValue = LastCandlestick.c;
closeValuesArray.push(CloseValue);
if (ChunkProcessing === true) { // === true not needed but it's there for clarity
const CloseValueSeries = createCloseValueSeries(LastCandlestick, CloseValue);
CloseValueSeriesArray.push(CloseValueSeries);
}
};
//Update the data for the SMA series
if (closeValuesArray.length >= changer) {
// CALCULATION ON EVERY CLOSE //
if (closeValuesArray.length >= changer && !cal_on_every_tick) {
lastChangerValues = closeValuesArray.slice(-changer);
sumClose = lastChangerValues.reduce((a, b) => +a + +b);
SMA = sumClose / changer;
colorSMA = (CloseValue >= SMA) ? '#0000FF' : '#FFA500';
if (ChunkProcessing === true) { // === true not needed but it's there for clarity
const SmaSeries = createSmaSeries(LastCandlestick, SMA, colorSMA);
SmaSeriesArray.push(SmaSeries);
};
};
};
return {
CandleSeriesArray,
SmaSeriesArray,
CloseValueSeriesArray,
};
}
Причина отрицательного голосования, вероятно, заключается в том, что мы не знаем, как код связан с результатами, которые вы нам показываете. Нам нужно что-то увидеть в форме data -> function -> result, чтобы иметь представление о том, почему у вас возникли проблемы.
Теперь я добавил свой вопрос и объяснение, как получаются данные и как они выглядят. затем, как должен выглядеть результат, и я разделил функциональную часть отдельно от рабочего приема и публикации, чтобы ее было легче читать. Если что-то еще появится, пожалуйста, скажите об этом!



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В частности, для этой части кода:
//CLOSEVALUE OF CANDLESTICK
MessageArray.push(candlestick)
let PreviousCandlestick = undefined;
if (MessageArray.length >= 2) {
PreviousCandlestick = MessageArray[MessageArray.length - 2]
};
if (PreviousCandlestick && PreviousCandlestick.T < candlestick.t) {
PreviousCandlestick не определен. Вы проверяете, содержит ли MessageArray более двух элементов. Где-то выше у нас есть:
var candlestick = message.k
Этот элемент был помещен в MessageArray, так что, может быть, массив имеет только один элемент и, следовательно, не проходит проверку > 2, а PreviousCandlestick не проходит проверку if?
Итак, я проверил это, но длина массива сообщений превышает 20 КБ, так что это не так.
Итак, я понял это! Я не осознавал этого, когда проверял данные, поскольку увидел лишь незначительное изменение, но не обратил на него более пристального внимания.
E: 1716823048658, T: 1716823079999, t: 1716823020000
E: 1716823079998, T: **1716823139999**, t: 1716823020000
E: 1716823080001, T: 1716823139999, t: **1716823080000**
Упомянутая вами часть проверяет, ниже ли предыдущее значение T, чем текущее значение t, которое показывает, что началась новая минута (в одной строке T всегда>, чем t). поскольку код создания данных сделал значение T предыдущей свечи (второй) таким же, как значение T фактического минутного изменения (третьей), то есть на 60000 выше, чем должно быть на самом деле. Значение t никогда не может быть выше T. Это привело к тому, что третья функция также не получила данные, поскольку она основана на второй функции. вот как должны выглядеть данные:
E: 1716823048658, T: 1716823079999, t: 1716823020000
E: 1716823079998, T: **171682079999,** t: 1716823020000
E: 1716823080001, T: 1716823139999, t: 1716823080000
Вывод: всегда тщательно проверяйте данные! И спасибо за помощь
Пожалуйста, добавьте свои ожидания, ваш пост на самом деле не содержит настоящего вопроса.