LINUX.ORG.RU

fabric js - серъезный баг

 ,


0

1

Я формирую массив значений глобальных координат

Таким образом

 abs_points.forEach(function(gp, gpi) {
    abs_points[gpi] = fabric.util.transformPoint(gp, invgMatrix);
  }); 

Так вот значения полученного массива зависят от того выполняется или нет код дальше

Там разные ф-ции. Немного глобальных переменных

И вот этот массив abs_points не глобальный

Весь код дальше не изменяет abs_points

Но если он выполняется то в abs_points появляются дублирующиеся значения координат.

Проверял десятки раз.

И ни разу значения не дублируются если код не выполняется

★★

Последнее исправление: mirek (всего исправлений: 1)

Напрашивается map вместо forEach.

vvn_black ★★★★★
()

Очень простое правило: никогда не изменяй объект, являющийся аргументом для твоей процедуры. В данном случае вывести массив из категории «аргумент» можно переписав код на простой цикл for (let i = 0;...) — почему-то жаваскриптеры боятся ими пользоваться.

byko3y ★★★★
()

На крайняк такое говно, точно должно работать как тебе нужно))

let tmp_abs_points = [];
abs_points.forEach(function (gp, gpi) {
    tmp_abs_points[gpi] = fabric.util.transformPoint(gp, invgMatrix);
});
abs_points = tmp_abs_points;
romanlinux ★★★
()
Ответ на: комментарий от romanlinux

Что-то типа такого я сделал. Страховочный массив с эталонными значениями.

Но это ЗВЕРСКИЙ ИЗВРАТ ПРОСТО!

Может дело в forEach-ах ? Ну зачем это тогда ввели в язык ?

В основном код ниже часто делает forEach-и не касающиеся массива abs_points

mirek ★★
() автор топика
Ответ на: комментарий от Miguel

Не доказано, что причина бага с массивами объектов точек в fabric

Работаю больше полу года с fabric. Раньше не замечал такого

в массиве приблизительно такая инфа

Array(5)
0: {x: 626.3074999999999, y: 435.31}
1: {x: 657.5574999999999, y: 435.31}
2: {x: 657.5574999999999, y: 460.31}
. . .

И иногда он вдруг становится

Array(5)
0: {x: 626.3074999999999, y: 435.31}
1: {x: 657.5574999999999, y: 435.31}
2: {x: 657.5574999999999, y: 435.31}
. . .

Так и не разгадал эту загадку ( Все функции перебрал которые как либо косвенно могли бы изменить этот массив

mirek ★★
() автор топика
Последнее исправление: mirek (всего исправлений: 1)
Ответ на: комментарий от mirek

Код-то где? Какой смысл этого поста. Ты хочешь, чтобы тебе чем-то помогли гадая на кофейной гуще? Ну пожалуйста - вангую, что ты неправильно работаешь с ссылочными типами и в каком-то месте вместо копирования сущности, передаешь ссылку на одну и ту же.

javascript
()
Ответ на: комментарий от javascript

Кода там под мег)

Я еще всегда делаю […array] или {…point} )

И поэтому такого места не найти где оно бы могла измениться

mirek ★★
() автор топика

Серьезный баг в твоем коде, почитай про map и заюзай его + еще и упростишь код.

anonymous
()

походу запоминается gp в недрах фабрик где-то.

так-то должно работать.

> var x = [1,2,3];
undefined
> x.forEach((x, i, a) => { a[i] = { x }; })
undefined
> x
[ { x: 1 }, { x: 2 }, { x: 3 } ]
> x.forEach((x, i, a) => { a[i] = { x }; })
undefined
> x
[ { x: { x: 1 } }, { x: { x: 2 } }, { x: { x: 3 } } ]

drsm ★★
()
Ответ на: комментарий от drsm

Я нашел участок из десятка строк при прохождении которого изменяется массив

И ни к чему оно все равно не привело. Функции на этом участке используют простые типы данных

Сам участок в foreach-е

Массив изменяется на 2 или 3 итерации

mirek ★★
() автор топика
Ответ на: комментарий от drsm
  while(busy_points.length == 0 && bpl_cyc <= 4) { //-- && bpl_cyc <= 1
      if(cGPi == -1) {
        point.x = gpoints[0].x;
        point.y = gpoints[0].y;
  
        fp.x = gpoints[tmp_gps_array_length - 1].x;
        fp.y = gpoints[tmp_gps_array_length - 1].y;
        cp.x = point.x;
        cp.y = point.y;
        sp.x = gpoints[1].x;
        sp.y = gpoints[1].y;


        cGPi = 0;
        point.refp_idx = 0;
        point.angle = CheckAngle_at_cGPi(cGPi);
        point.check_space = getCheckSpace(fp, cp, sp, point.angle);
        point.node_st = true;
      } else {
        
      } /* if cGPi == -1 ... else ... */

    
      prev_cGPi = get_prev_cGPi(cGPi);

      next_cGPi = get_next_cGPi(cGPi);

  
      if(compareAngle(point.angle, Math.PI / 2, '<')) {
} else if(compareAngle(point.angle, Math.PI / 2, '>=')) {
     fpang = lineAngle(cp, fp);
        spang = lineAngle(cp, sp);

 if(DistBeenTwoP(gpoints[prev_cGPi], gpoints[cGPi]) < mp800_red25) {
        fp = gpoints[prev_cGPi];
      } 

point.spr_type = 'mp-800-red25';
 point.start_angle = spang;
}

Ну и? Легче стало ?)

Все эти DistBeenTwoP, compareAngle, CheckAngle_at_cGPi в итоге работают с простыми типами И никак не могут изменять gpoints

А он изменяется где-то на 2 или 3 проходе в while

mirek ★★
() автор топика
Ответ на: комментарий от drsm

То есть намек на то, что

fp = gpoints[prev_cGPi];

так получается ссылка на элемент в массиве gpoints ?

И потом если изменять fp то изменяется и содержимое gpoints Верно ?

mirek ★★
() автор топика
Ответ на: комментарий от mirek

И потом если изменять fp то изменяется и содержимое gpoints Верно ?

да

drsm ★★
()
Ответ на: комментарий от mirek

Функции на этом участке используют простые типы данных

Марш учить JS. Объект — это не примитивный тип данных. При присвоении он передаётся по ссылке, а не по значению.

static_lab ★★★★★
()
Ответ на: комментарий от anonymous

Баги все СЕРЬЕЗНЫЕ …

Точнее

Все баги - СЕРЬЕЗНЫЕ …

Потому как из-за несерьезных багов ракеты летят не в цель, а в свинарники.

anonymous
()
Ответ на: комментарий от static_lab

Марш учить JS. Объект — это не примитивный тип данных. При присвоении он передаётся по ссылке, а не по значению.

да не, чел вроде понимает.

это частая ошибка заалиасить переменную где-то в глубоком бранче который срабатывает в 5% случаев, а потом сидеть тупить, бывает.

для этого и нужны ревьюеры.

ну а все из-за того что код плохо структурирован.

drsm ★★
()
Ответ на: комментарий от vvn_black

Отличный форум, я вот проходит курсы и понимаю, что я даже половины не знаю того, что здесь обсуждают.

YegorBorisovich
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.