• Почему offsetWidth вычисляет ширину HTML без учета полосы прокрутки?

    dedavarera
    @dedavarera Автор вопроса
    Зарубежные друзья помогли разобраться в вопросе:
    https://stackoverflow.com/questions/68544990/why-d...

    Итог: свойство offsetWidth возвращает ширину элемента вместе с шириной полосы прокрутки (если она имеется) для всех элементов (даже для body), кроме document.documentElement.

    Более того, в процессе поиска ответа на вопрос наткнулся еще на одну интересную деталь уже для свойства clientWidth: данное свойство предлагается использовать на document.documentElement в качестве «линейки» для измерения видимой ширины документа (видимой области содержимого) в том числе на популярном обучающем ресурсе.

    Однако хотелось бы акцентировать внимание на том, что clientWidth на document.documentElement — это особый случай, возвращающий именно ширину видимой области содержимого. Если мы установим для document.documentElement свойство width = 180px (или 300px, 400px, 600px — неважно), а затем проверим document.documentElement.clientWidth, то не увидим установленного значения в 180px, а увидим ширину видимой области содержимого (за исключением ширины полосы прокрутки, если она имеется). Свойство offsetWidth в этом случае покажет другое, правильное значение: 180px + внутренние отступы + границы (не включая, как мы уже выяснили, ширину полосы прокрутки, если таковая имеется).
    Ответ написан
    Комментировать
  • Почему измененный код асинхронного итератора не работает?

    dedavarera
    @dedavarera Автор вопроса
    Все, коллеги, разобрался. Я не вернул сам промис.
    Вот такой код работает:

    let range = {
      from: 1,
      to: 5,
    
      [Symbol.asyncIterator]() {
        return {
          current: this.from,
          last: this.to,
    
          next() {
    
          	return new Promise(resolve => setTimeout(resolve, 2000))
            .then(() => {
    					if (this.current <= this.last) {
              	return { done: false, value: this.current++ }
            	} else {
              	return { done: true }
            	}
            })
    
          }
        }
      }
    }
    
    let count = async function() {
    	for await (let value of range) {
        console.log(value);
      }
    }
    
    count()


    И отвечая на доп. вопрос: все же так можно сделать, и это видно из кода выше. Метод then возвращает промис, но с нюансами: если обработчик handler в then(handler) заканчивается возвратом некоторого значения, то возвращенный then промис выполняется с этим значением.

    В моем первом случае обработчик возвращал новый промис, и возвращаемый then промис завершался с результатом этого нового промиса, что, собственно, делать было не обязательно и являлось лишним шагом в коде.

    Итого: завершенный с некоторым результатом промис возвращается из then, но его надо вернуть из next().
    Ответ написан
    Комментировать