Что может сделать так, что одна часть моей функции, вызванной веб-воркером, вычисляется, а остальная часть не без ошибок?

Мой вопрос/ожидание состоит в том, чтобы найти возможную точку или утверждение, которое может вызвать такие проблемы. Если вы сталкивались с чем-то подобным в 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,
        };
    }

Пожалуйста, добавьте свои ожидания, ваш пост на самом деле не содержит настоящего вопроса.

cyberbrain 02.06.2024 17:10

Причина отрицательного голосования, вероятно, заключается в том, что мы не знаем, как код связан с результатами, которые вы нам показываете. Нам нужно что-то увидеть в форме data -> function -> result, чтобы иметь представление о том, почему у вас возникли проблемы.

Lasse Michael Mølgaard 02.06.2024 17:27

Теперь я добавил свой вопрос и объяснение, как получаются данные и как они выглядят. затем, как должен выглядеть результат, и я разделил функциональную часть отдельно от рабочего приема и публикации, чтобы ее было легче читать. Если что-то еще появится, пожалуйста, скажите об этом!

Schtraded 02.06.2024 17:52
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В частности, для этой части кода:

//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 КБ, так что это не так.

Schtraded 02.06.2024 19:05
Ответ принят как подходящий

Итак, я понял это! Я не осознавал этого, когда проверял данные, поскольку увидел лишь незначительное изменение, но не обратил на него более пристального внимания.

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

Вывод: всегда тщательно проверяйте данные! И спасибо за помощь

Другие вопросы по теме