• Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    Я понимаю, что здесь не место для кодревью, и мне нужно просто читать доки, но я был бы признателен, если бы Вы сказали, насколько грубые ошибки я допустил в примере ниже?
    Так-то всё работает и я получил то, что мне нужно, сократив количество кода в несколько раз, но меня никак не покидает ощущение, что я пользуюсь инструментом не по его прямому назначение, слишком усложняю или не использую какие-то возможности в силу отсутствия опыта.

    getVerbosePackages(packages: Package[]): void{
        forkJoin(this.packages.map(pack => this.packageService.getPackage(pack.id)))
          .subscribe((result) => {
            this.getPackagesData(result);
            this.getExtendedParameters();
          })
      }
    
     getPackagesData(packages: Package[]): void {
        forkJoin(
          packages.map(pack => this.experimentService.getLastExperimentVerbose(pack.questionnaire.id))
        ).subscribe((result) => {
          console.log(result);
        })
      }
    
      getExtendedParameters(): void {
        forkJoin(
          this.packageParameters.map(parameter => this.colleagueService.getParameterVisibility(parameter.id))
        ).subscribe((result) => {
          console.log(result);
        })
      }
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    Спасибо!
    Нечто подобное я и искал, ибо смешивание RxJS с промисами вызывало у меня чувство дискомфорта. Был уверен, что в RxJS должна существовать какая-то реализация.
    Тем не менее, на первый взгяд, forkJoin кажется мне чем-то непонятным и сложным. Не ясно, как с помощью этого можно уйти от промисов.
    Иду читать доки :)
    Ещё раз спасибо.
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    GlazOtca,
    Как-то так?
    getVerbosePackages(packages: Package[]): void {
        let promises = []
    
        packages.forEach((pack) => {
          promises.push(this.getVerbosePackage(pack));
        })
    
        Promise.all(promises).then((result) => {
          console.log(result);
        })
      }
    
      getVerbosePackage(pack: Package): Promise<any> {
        return new Promise((resolve, reject) => {
          this.packageService.getPackage(pack.id)
            .pipe(takeUntil(this.ngUnsubscribe))
            .subscribe((pack: Package) => {
              resolve(pack);
            }, error => reject(error))
        })
      }
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    GlazOtca, аааа, чёрт, кажется, я понял, что Вы имели в виду
    Мне нужно каждый отдельный элемент массива обернуть в промис, а не весь массив целиком.
    То есть один элемент массива делает один запрос на сервер -> резолвиться один ответ. И таким образом мы с помощью Promise.all пробегаемся по всему массиву.
    Правда, я не понимаю, как это сделать, но спасибо, что сделали сдвиг в моей голове ;D
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    (UPD)
    Промисы не помогли.
    В консоль-то может результат и выводится, но как я понимаю, это уже бразуер сам обновляет содержимое массива по приходе данных. Но на деле в момент выполнениня console.log() массив всё ещё пуст, так как ответ с сервера не пришёл.
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    GlazOtca, а ещё я не понимаю, зачем мне тут Promise.all?
    Мне ведь для того, чтобы выполнить один промис, нужен результат предыдущего промиса. А Promise.all, если я не ошибаюсь, используется тогда, когда у нас есть несколько независимых друг от друга промисов.
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    GlazOtca, ну, для Promise.all нужно написать функции-промисы. Вот я показал одну из них, но не понял, почему она работает так, как мне нужно, ведь по идее resolve() произошёл до того, как программа получила ответ от сервера.
  • Как правильно работать с массивами в RxJs?

    sxenguri
    @sxenguri Автор вопроса
    Да, промисы действительно помогли, но я никак не могу понять вот какой момент.

    getVerbosePackages(): Promise<any> {
        return new Promise((resolve, reject) => {
          this.packages.forEach((pack) => {
            this.packageService.getPackage(pack.id)
            .pipe(takeUntil(this.ngUnsubscribe))
            .subscribe((pack: Package) => {
              console.log(pack);
              this.verbosePackages.push(pack);
            })
          })
    
          console.log('END');
          resolve(this.verbosePackages);
        })
      }


    В консоли сначала выведится END, затем, по идее, должен произойти resolve промиса, и только затем начнут приходить ответы от бекенда и, соответственно, заполняться нужный мне массив.
    Но на момент резолва этот массив был пустым, так как ответы от сервера ещё не пришли, но при этом промис возвращает заполненный массив.
    Почему так? Почему даже после того, как произойдет резолв промиса, console.log() внутри этого промиса всё равно будет срабатывать по ходу прихода ответов от сервера.
    Вероятно, я просто не правильно понимаю, что происходит в программе после того, как выполняется resolve().
  • Math.Acos() возвращает странные значения?

    sxenguri
    @sxenguri Автор вопроса
    Developer, 30123,31370333 / 30123,31370333 = 1;
    Остальные ячейки массива заполняются по такой же формуле, но с немного другими значениями.
  • Math.Acos() возвращает странные значения?

    sxenguri
    @sxenguri Автор вопроса
    Developer, да вот вроде и читал разную литературу про весь этот низкий уровень, но либо ты не совсем понимаешь, о чём идёт речь, либо из головы всё вылетает спустя некоторое время, так как на практике с этим особо и не сталкиваешься.
    Сейчас вот столкнулся. Буду снова изучать этот вопрос.
    Спасибо Вам за помощь!
  • Math.Acos() возвращает странные значения?

    sxenguri
    @sxenguri Автор вопроса
    Developer, Но тут стоит уточнить, каким именно путём число 1 оказалось в массиве типа double. Если вручную занести в массив это число, то, думаю, всё будет хорошо.
    Но в моём случае 1 получается путем деления двух чисел с плавающей точкой.
  • Math.Acos() возвращает странные значения?

    sxenguri
    @sxenguri Автор вопроса
    Developer, Я, кажется, солгал, когда сказал, что по всем 16 значениям у меня неверно считает Acos. Я сейчас перепровил, везде всё верно, кроме того места, где должно быть число 1.

    Значит, тут проблем уже не в самом методе Math.Acos(), а в том, что тип double хранит в себе не чёткое целочисленное значение, а значение с плавающей точкой, максимально близкое к нужному целому. Например:
    1 = 0,999999999
    Я Вас правильно понял?
  • Math.Acos() возвращает странные значения?

    sxenguri
    @sxenguri Автор вопроса
    Developer, ну, я вот вывожу значения массива, показывает 1, но на деле, если я всё правильно понял, там не 1, а 0.9999999999999999. У меня по всем 16 значениям массива выходит неверный Acos, хотя если вбить в каком-нибудь калькуляторе эти же самые значения, то там всё будет верно.
  • Math.Acos() возвращает странные значения?

    sxenguri
    @sxenguri Автор вопроса
    Да, Вы правы, массив действительно типа double.
    А как быть в таком случае?
    У меня в массиве 16 значений от 0 до 1.
  • Что сейчас приоритетнее верстка или JS?

    sxenguri
    @sxenguri
    Ну, не обязательно знать JS, чтобы скопипастить со StackOverflow какой-нибудь слайдер или модальное окно.
  • Что сейчас приоритетнее верстка или JS?

    sxenguri
    @sxenguri
    unia_9987, это ведь зависит от вакансии. Если в требованиях указаны JS + Vue / React / Angular, то ваши куча сверстанных макетов большой роли не сыграют, если вы не изучили JS.

    но JS я не разобрал на 100%.

    Вы не разберёте JS на 100%.

    Я не обладаю большим опытом, так как сам ещё студент, но выскажу своё мнение.
    Не стоит слишком сильно зацикливаться на вёрстке.
    Сверстать 3-4 макета по роликам с YouTube (Фрилансер по жизни) + самостоятельно сверстать 2-3 макета, параллельно гугля непонятные моменты.
    Этого будет достаточно на первое время.
    После этого можно углубляться в JS.
  • Как правильно парсить данные из Excel файла?

    sxenguri
    @sxenguri Автор вопроса
    Ячейки называются точно так же, какой они в себе содержат контент. Если я правильно понял, что Вы имеете в виду.
    5ffea107543cf294130248.png