Size: a a a

2020 November 03

YL

Yan👀 Lobaty in ☄️ effector
Dmitry Olyenyov
https://share.effector.dev/YnxTNnFn А подскажите, это идеологически правильный способ получить event "updated", который стреляет только если значение, приходящее в event'е receivedFromBackend, изменилось?
в таком простом кейсе это будет оверкилом достаточно сделать так
источник

YL

Yan👀 Lobaty in ☄️ effector
Miseo
тут не понял
минуту
источник

DO

Dmitry Olyenyov in ☄️ effector
Аааа, точно, если возвращаем undefined, то ничего не происходит. А насчёт race condition? Есть какой-то определённый порядок в котором вызываются event'ы, watch'и и всякие sample?
источник

DS

Dmitriy Shuleshov in ☄️ effector
Прикольно ты замкнул айдишник в ивенте👍
источник

AO

Aleksandr Osipov in ☄️ effector
Dmitriy Shuleshov
Прикольно ты замкнул айдишник в ивенте👍
В сторе же?
источник

DS

Dmitriy Shuleshov in ☄️ effector
Aleksandr Osipov
В сторе же?
В ивенте нотифайд
источник

DS

Dmitriy Shuleshov in ☄️ effector
Aleksandr Osipov
В сторе же?
Ну те смотри, на тот момент когда уже в сторе инное значение, ивент сохранит свой контекст или пейлоад (целевой id)
источник

AO

Aleksandr Osipov in ☄️ effector
Dmitriy Shuleshov
Ну те смотри, на тот момент когда уже в сторе инное значение, ивент сохранит свой контекст или пейлоад (целевой id)
да
источник

DS

Dmitriy Shuleshov in ☄️ effector
Miseo
Короче. Я тупо в шоке. Может быть я не проснулся, хотя кофе уже пью… помогите как у меня получается умножать количество объектов в результирующем масиве? вот логика. Она предельно проста.

приходят новые данные newData дальше проверяем условие, если новые данные типа «а» и их больше нуля, тогда присваеваем их в обект.
Потом приходят другие данные, типа «б» я их присваиваю в результирующий объект. А так как данные типа «а» не пришли я беру их из allStore, где в массиве типа «а» должно быть 23 объекта.
но где то на третьей итерации у меня в массиве становится то 46 то 69 объектов, причём то типа «а» то типа «б». И я не могу понять где я ошибаюсь. Должно быть 23 объекта.

wrapperStore.on(addToWrapperStore, (allStore, newData) => {

   let allData = {};

   if (newData.type === 'a' && newData.data.length > 0) {
      allData.a = newData.data;
   } else if (allStore.a !== undefined) {
      allData.a = allStore.a;
   } else {
     allData.a = [];
 }

  if (newData.type === 'b' && newData.data.length > 0) {
    allData.b = newData.data;
  } else if (allStore.b !== undefined) {
    allData.b = allStore.b;
  } else {
   allData.b = [];
 }

  return allData;
});
allData.b = allStore.b

Объекты в js присваиваются по ссылке.
источник

YL

Yan👀 Lobaty in ☄️ effector
Miseo
тут не понял
какое дефолтное значение у allData.a и allData.b?
источник

M

Miseo in ☄️ effector
по дефолту их нет вообще. потому что при проходе создаётся новый пустой объект и к нему добавляются свойстава а и б
источник

M

Miseo in ☄️ effector
Dmitriy Shuleshov
allData.b = allStore.b

Объекты в js присваиваются по ссылке.
да. но я же тут просто заменяю старые данные на новые. разве нет ?
источник

DS

Dmitriy Shuleshov in ☄️ effector
Miseo
да. но я же тут просто заменяю старые данные на новые. разве нет ?
Ты устанавливаешь ссылку в новом обьекте на поля старого

Просто скопируй вначале allStore
const allStoreCopy = {...allStore}
источник

M

Miseo in ☄️ effector
Dmitriy Shuleshov
Ты устанавливаешь ссылку в новом обьекте на поля старого

Просто скопируй вначале allStore
const allStoreCopy = {...allStore}
Немного не понял. А можно подробнее? а потом присваивать новые данные объекту allStoreCopy?
источник

DS

Dmitriy Shuleshov in ☄️ effector
Miseo
Короче. Я тупо в шоке. Может быть я не проснулся, хотя кофе уже пью… помогите как у меня получается умножать количество объектов в результирующем масиве? вот логика. Она предельно проста.

приходят новые данные newData дальше проверяем условие, если новые данные типа «а» и их больше нуля, тогда присваеваем их в обект.
Потом приходят другие данные, типа «б» я их присваиваю в результирующий объект. А так как данные типа «а» не пришли я беру их из allStore, где в массиве типа «а» должно быть 23 объекта.
но где то на третьей итерации у меня в массиве становится то 46 то 69 объектов, причём то типа «а» то типа «б». И я не могу понять где я ошибаюсь. Должно быть 23 объекта.

wrapperStore.on(addToWrapperStore, (allStore, newData) => {

   let allData = {};

   if (newData.type === 'a' && newData.data.length > 0) {
      allData.a = newData.data;
   } else if (allStore.a !== undefined) {
      allData.a = allStore.a;
   } else {
     allData.a = [];
 }

  if (newData.type === 'b' && newData.data.length > 0) {
    allData.b = newData.data;
  } else if (allStore.b !== undefined) {
    allData.b = allStore.b;
  } else {
   allData.b = [];
 }

  return allData;
});
А вообще конечно лучше показать больше контекста.
Как кажется вам нужно явно разделить на два стора
источник

DS

Dmitriy Shuleshov in ☄️ effector
Dmitriy Shuleshov
allData.b = allStore.b

Объекты в js присваиваются по ссылке.
Что лежит в олстор.в?
источник

M

Miseo in ☄️ effector
Dmitriy Shuleshov
Что лежит в олстор.в?
object
{
 a: [],
 b: [],
}


и по идее там или пусто должно быть или 23 объекта в каждом
источник

DS

Dmitriy Shuleshov in ☄️ effector
Miseo
object
{
 a: [],
 b: [],
}


и по идее там или пусто должно быть или 23 объекта в каждом
источник

DS

Dmitriy Shuleshov in ☄️ effector
Miseo
object
{
 a: [],
 b: [],
}


и по идее там или пусто должно быть или 23 объекта в каждом
allData.b = allStore.b
Заменить
allData.b = [...allStore.b]
источник

M

Miseo in ☄️ effector
Dmitriy Shuleshov
allData.b = allStore.b
Заменить
allData.b = [...allStore.b]
запуская получаю такую картину:

{ a: 23, b: 0 }

{ a: 23, b: 23 }

{ a: 23, b: 23 }

{ a: 46, b: 23 }

{ a: 23, b: 46 }

{ a: 46, b: 23 }

{ a: 23, b: 46 }

{ a: 46, b: 23 }

{ a: 23, b: 46 }

{ a: 46, b: 23 }
источник