Задать вопрос
  • Как асинхронный код сделать пошаговым?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Эти классы расширяют THREE.Loader, а у него есть метод loadAsync.
    Т.е. в теории, всё, что тебе надо делать, это:
    const loader_1 = new GCodeLoader();
    const loader_2 = new AMFLoader();
    
    let ask_1 = true;
    let ask_2 = true;
    
    async function main() {
      console.log('Start load')
    
      if (ask_1){
        const amfobject = await loader_1.loadAsync( './models/amf/rook.amf');
        scene.add( amfobject );
        console.log('on loader AMF', amfobject);
      }
    
      if (ask_2){
        const object = await loader_2.loadAsync( 'models/gcode/benchy.gcode');
        scene.add( object );
        console.log('on loader GCode', object);
      }
    
      console.log('END load')
    }
    
    main();

    Сам не проверял, но по документации должно работать.)

    P.S. Но вообще, если собираешься и дальше работать с js - тебе надо изучить асинхронность. То, что ты понаписал - откровенная чушь, показывающая, что ты в принципе не понимаешь, как оно работает. Просто открой учебник и перечитывай до просветления.
    Там нет никакой магии, которая волшебным образом заставит твой код работать. Promise - это просто хитрая надстройка надо коллбэками(полностью реализуемая на обычном js), позволяющая развернуть их порядок назначения - не более. async-await - просто синтаксический сахар над Promise, делающий оные менее многословными, но не меняющий механизма.
    Ответ написан
  • Как правильно выполнить типизацию кода на React (children и ответ при асинхронном запросе)?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    1. У реакта есть хэлпер PropsWithChildren<Props>. Но под капотом он просто делает так:
    type PropsWithChildren<P> = P & { children?: ReactNode };

    ...upd: вник чутка)
    Если тебе нужен render проп в children, то явно и тапизируй, никаких подвохов:
    type TwitterProps = {
        children: (user: string) => ReactNode
    }

    2. Так и типизировать: const response: ITwitter = .... Только если какая-нить хрень прилетит то может сломаться в рантайме, так что либо ты доверяешь серверу, либо используешь какую-нить либу для дополнительной проверки вживую.)
    Ответ написан
    Комментировать
  • Как перезаписать поля HTMLElement полями из входного объекта в Typescript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Яб сделал так:
    type WritableFields<T> = Partial<Pick<T, WritableKeys<T>>>;
    export function createElement<K extends keyof HTMLElementTagNameMap>(tag: K, options?: WritableFields<HTMLElementTagNameMap[K]>): HTMLElementTagNameMap[K] {
      let element = document.createElement(tag)
    
      if (options) {
        // assign options
        Object.assign(element, options);
      }
    
      return element
    }


    Если нужно именно с перебором, то можно так:
    type WritableFields<T> = Partial<Pick<T, WritableKeys<T>>>;
    export function createElement<K extends keyof HTMLElementTagNameMap>(tag: K, options?: WritableFields<HTMLElementTagNameMap[K]>): HTMLElementTagNameMap[K] {
      let element = document.createElement(tag)
    
      if (options) {
        // assign options
        let option: keyof typeof options;
        for (option in options) {
          element[option] = options[option]!; // ! - потому что теоретически ты можешь передать undefined явно, но морочиться с этим не стоит
        }
      }
    
      return element
    }


    P.S. Вообще все сложности с перебором переданного объекта в typescript происходят из того, что типизация в нём структураная: например имея интерфейс параметра, например,
    interface Foo {
      foo: number;
    }
    тебе ничего не мешает передать ему
    {
      foo: 1,
      bar: 2
    }
    , т.к. данный объект расширяет интерфейс Foo и, соответственно, удовлетворяет ему. Получается, что внутри функции typescript никак не может быть уверен, что ключи указанные в интерфейсе - это ВСЕ ключи, а значит не может быть уверен, что при переборе и присвоении не будет присвоено что-то лишнее. (Это не говоря уже о прототипах, геттерах и прочем)
    Потому и требуется куча плясок, увы.
    Ответ написан
    6 комментариев
  • Как на JS можно пакетно получать ответ сервера и сразу отправлять на другой сервер?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Без предварительной подготовки принимающего сервера(чтоб отсылать кусками и тот их склевал) - нет.
    Готовится сейчас механизм потоков, который это в теории позволит, но он нигде пока не работает.
    Ответ написан
    Комментировать
  • Почему выдает ошибку Nuxt + TypeScript?

    Aetae
    @Aetae Куратор тега TypeScript
    Тлен
    Вы использовали инструкцию или просто рандомно подключили TypeScript к Nuxt?
    Дело в том, что Nuxt много чего подключает неявно, в т.ч. и роутер, и потому TypeScript не знает о том, что в типе Vue появились дополнительные свойства типа $route. Надо отдельно подключать декларации вручную, либо следовать инструкции выше.
    Ответ написан
    Комментировать
  • Как обратится к третьему по счёту ключу объекта, если ты не можешь предсказать какое будет у ключа имя?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Нихрена не понятно, но допустим так:
    function getRandomAtKey(object, keyIndex = 2) {
      for (const key in object) if(--keyIndex < 0) {
        const arr = object[key];
        return arr[Math.floor(Math.random() * arr.length)];
      }
    }
    Ответ написан
    Комментировать
  • Как изменить цвет на градиент в тэге svg?

    Aetae
    @Aetae
    Тлен
    Это должно гуглиться за минуту.
    Ответ написан
    Комментировать
  • Как правильно представить строку в Uint64_t в javascript?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Из коробки: TextEncoder, BigUint64Array и немного перекидывания.
    А так - нет "правильного", всё зависит от нужной кодировки и порядка байт.
    Ответ написан
  • Как вывести 404 в Vue?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Всё работает:
    Подозреваю что-то у вас с настройкой реврайта сервера.
    Ответ написан
    Комментировать
  • Как правильно обработать данные через axious?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Хуки Vue синхронные. Никто никого не ждёт. Не вызывайте getMediaUrls пока не будет данных.

    Если вызов происходит в шаблоне - во-первых: не используйте методы в шаблонах без крайней необходимости: вместо метода getMediaUrls должно быть computed свойство mediaUrls; во-вторых: скрывайте в шаблоне отображение пока не появятся данные: v-if="currentProductData"/v-if="currentProductData.length" и показывайте вместо этого какой-нить loader, Vue не запросит то, что скрыто под v-if пока условие не станет верным.

    ...upd: посмотрел полный код. Незачем выносить getMediaUrls в mounted и разрывать асинхронную цепочку. Вызывайте его сразу в getProductData, либо если currentProductData может меняться в иных случаях - сделайте, опять же, computed свойством. В крайнем случае можно вызывать его, повесив watch на currentProductData, но computed лучше.
    Ответ написан
  • Как решить синтаксическую ошибку Vue?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Проблема в том, что js в шаблонах Vue 2 - это не совсем js, а особый сабсет, обрабатываемый vue-loader'ом(посредством vue-template-compiler'а). Соответственно, никакой babel к нему не применяется, а писался он до того как придумали optional chaining. Как раз из-за таких подлянок в Vue 3 отказались от такого подхода(а за одно выкинули фильтры, собаки).

    Быстрый поиск сразу выдал vue-nullable-loader - эта хрень на регулярках, а не на анализе AST, так что возможны глюки, но в целом должно работать.

    P.S. Вообще странно, что никто не сделал этого как module для vue-template-compiler...
    Ответ написан
    Комментировать
  • Почему не работает редирект на сафари?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    PHP: не проставлен http_response_code редиректа (30х).
    JS: использована строка в setTimeout вместо функции, использовано document.location вместо window.location.

    Всё это может быть причиной, т.к. это нестандартное и\или устаревшее поведение. Но мака нет, чтоб проверить, он может тупо блокировать редиректы по какой-то своей причине.)
    Ответ написан
    Комментировать
  • Почему v-on:click срабатывает при нажатии на Enter?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Vue тут не при чём, обычная легаси логика поведения формы:
    <form>
      <input />
      <button onclick="alert('Такие дела')"></button>
    </form>

    Тянется ещё с тех времён, когда вэб - это было "не серьёзно", и браузеры считали, что думать за криворуких веб-мастеров и считать enter кликом - это всем на пользу.
    Ответ написан
    Комментировать
  • Ошибки при установке ( npm install )?

    Aetae
    @Aetae
    Тлен
    Установи пуфон, очевидно же. На большинстве линухов он из коробки, что у тя за дистриб?
    Ну и не-lts ноду юзать не рекомендуется, многие пакеты не успевают подтягиваться.
    Ответ написан
    5 комментариев
  • Как проверить наличие массива в json?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    if (Array.isArray(result?.validate)) {
      // есть ошибки
    }

    Чтоб наверняка.)
    Ответ написан
    Комментировать
  • Как перебрать вложенный объект?

    Aetae
    @Aetae Куратор тега Vue.js
    Тлен
    Как-то так, ничего неожиданного:
    <div class="row">
      <div class="input-field col s12">
        <select class="group-select" ref="select2" v-model="depart_select">
          <optgroup v-for="department in departments" :key="department.id" :label="department.NameOtdel">
            <option v-for="{NamePodrazdel, id} in department.NamePodrazdel" :key="id" :value="id">{{ NamePodrazdel }} </option>
          </optgroup>
        </select>
        <label>Структурное подразделение</label>
      </div>
    </div>


    И настучите по голове бэку который использует транслит и PascalCase в именах. (Если бэк тоже вы - настучите себе, ничего не поделать)
    Ответ написан
    Комментировать
  • Что за шрифт на фото?

    Aetae
    @Aetae
    Тлен
    Может конечно и какой-то рукописный, но я ставлю на то, что кто-то разок вручную написал в всё.
    Ответ написан
    Комментировать
  • Как передать регулярку для метода replace и вызвать его в другом файле?

    Aetae
    @Aetae Куратор тега JavaScript
    Тлен
    Парень, учи js, начни с основ. Ты не понимаешь, что ты делаешь.

    1. anotherReplace: [/\(\.\*\)$/, ':name']
    2.
    function strReplace = (str, anotherReplace = null) => {
      str = str
        .replace(что-то заменяем)
        .replace(eщё что меняем);
      if (anotherReplace) 
        str = str.replace(anotherReplace[0], anotherReplace[1]);
      return str;
    }

    Это решит текущую "проблему", но если ты не изучишь основы - ты снова споткнёшься через десяток строк.
    Ответ написан