Загадка по js

Есть у нас обертка над XMLHttpRequest

function xhr(method, url, async, user, password) {

let r = new XMLHttpRequest();

r.open(method, url, async, user, password);

r.timeout = 10;

}


Отгадайте что может пойти не так?

Web-технологии

551 пост5.8K подписчиков

Правила сообщества

1. Не оскорблять других пользователей

2. Не пытаться продвигать свои услуги под видом тематических постов

3. Не заниматься рекламой

4. Никакой табличной верстки

5. Тег сообщества(не обязателен) pikaweb

0
Автор поста оценил этот комментарий

Ваша обертка никому не нужна, даже вам)


Берите Fetch/Axios

Либо по старинке jQuery.ajax()

раскрыть ветку (1)
Автор поста оценил этот комментарий

Конкретно эта обёртка действительно не нужна )
В реальности проксировались запросы стороннего модуля.
Приведённый код - лишь пример )

1
Автор поста оценил этот комментарий

Вы пишете:

т.е если верить данной документации, то вызовы
- open(method, url)
- open(method, url, undefined)
- open(method, url, true)
эквивалентны

Из чего вдруг следует, что эквивалентны первые два вызова?

Их неэквивалентность следует как минимум из стандарта языка. И если программист читал стандарт языка, то он будет знать, что js не поддерживает перегрузку методов, соответственно, опциональные параметры можно получить либо задавая параметры по умолчанию, как в стандарте ES2015, либо из объекта arguments, что предпочтительнее, т.к. обеспечивает хорошую обратную совместимость. А дальше - элементарное приведение undefined к Boolean.

Но часто ли вы заглядываете в описание стандартов, или всё же MDN чаще используется?

Нафига вообще нужен программист, который ни разу не читал стандарт языка, на котором пишет?

раскрыть ветку (1)
Автор поста оценил этот комментарий
Из чего вдруг следует, что эквивалентны первые два вызова?
Из документации MDN
И если программист читал стандарт языка, то он будет знать, что js не поддерживает перегрузку методов, соответственно, опциональные параметры можно получить либо задавая параметры по умолчанию, как в стандарте ES2015, либо из объекта arguments, что предпочтительнее, т.к. обеспечивает хорошую обратную совместимость.
Это не объясняет реализацию, и то что там происходит c приведением. То что там используется приведение undefined => false понятно только в практике. Я предполагал, что в обоих методах по умолчанию true.
Нафига вообще нужен программист, который ни разу не читал стандарт языка, на котором пишет?
Я очень рад, что вы помните абсолютно все стандарты.
1
Автор поста оценил этот комментарий

ВАУ! А чё хотел-то этим показать?

раскрыть ветку (1)
Автор поста оценил этот комментарий

Предположил, что кому либо будет интересно узнать про неочевидное поведение в js

0
Автор поста оценил этот комментарий

это же какая дырявая контора должна быть чтобы таких долбабёов нанимать которые не знают даже core

раскрыть ветку (1)
Автор поста оценил этот комментарий

Я очень рад, что вы изучили все стандарты js и их реализации, и никогда не столкнетесь c такими багами. Поздравляю вашего работодателя, что у него такой высококвалифицированный сотрудник, что вашему руководству не приходится выделять дополнительное время на дебаг вашей работы.

показать ответы
0
Автор поста оценил этот комментарий

Студентота приперлась выёбываться лабараторками

раскрыть ветку (1)
Автор поста оценил этот комментарий

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

показать ответы
Автор поста оценил этот комментарий

Ответ:

Проблема в том, что у стандарта XMLHttpRequest есть 2 метода open
https://xhr.spec.whatwg.org/#xmlhttprequest

Где
(new XMLHttpRequest()).open(method, url)
создает асинхронный запрос, но
(new XMLHttpRequest()).open(method, url, undefined)
создает синхронный запрос

Соответственно при вызове обертки xhr(method, url) js упадет с ошибкой присваивания timeout на синхронный запрос.

показать ответы
Автор поста оценил этот комментарий

Извиняюсь, что не всем оказался понятен смысл проблемы.


Попробую объяснить более подробно.


Открываем документацию к XMLHttpRequest (https://developer.mozilla.org/ru/docs/Web/API/XMLHttpRequest)


Где указано, что 3й параметр необязателен и по умолчанию равный true.


Вспоминаем, что если не передавать параметр в метод, то принимается undefined


т.е если верить данной документации, то вызовы

- open(method, url)

- open(method, url, undefined)

- open(method, url, true)

эквивалентны


В реальности оказывается, что есть два разных метода, вызываемых в зависимости от кол-ва передаваемых параметров. Причем дефолтное значение async в этих методах различное. Что несколько не очевидно.

показать ответы
2
Автор поста оценил этот комментарий

А вот и нифига=)

Открываем твою же документацию, самую что ни на есть официальную: https://xhr.spec.whatwg.org/#xmlhttprequest

И читаем там волшебную строчку под номером 7 (параграф 4.5.1. The open() method):

If the async argument is omitted, set async to true, and set username and password to null.

Потом смотрим на твой вызов open(method, url, undefined), и что мы видим?
Правильно: 3 аргумента.

Все переданные аргументы хранятся в специальном объекте arguments.

И в случае вызова open(method, url, undefined) arguments будет иметь вид:

{0: <method>, 1: <url>, 2: undefined}

но аргументов, тем не менее три, и это значит, что

аргумент async не опущен, и этот undefined преобразовывается в Boolean со значением false, что ожидаемо приводит к синхронному вызову.

раскрыть ветку (1)
Автор поста оценил этот комментарий

Считаю несколько некорректным приводить объяснение, уже после того как я сделал то-же самое тем-же самым образом. Данную ссылку я, как и вы, привел в объяснение данного поведения. Но часто ли вы заглядываете в описание стандартов, или всё же MDN чаще используется?

показать ответы
0
Автор поста оценил этот комментарий

курите мануалы, хули ..

ты бы еще на ноль поделил бы  и выёбывался бы эксепшеном ..

раскрыть ветку (1)
Автор поста оценил этот комментарий

Мануалы нестандартное для js поведение для данного случая не документируют

3
Автор поста оценил этот комментарий

Я вам тут своего говнокода неработающего принес. Найдите ошибку, ибо мне впадлу читать документацию

раскрыть ветку (1)
Автор поста оценил этот комментарий

Данный пост не просит вас искать ошибку, а предположить неочевидное и недокументированое поведение

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества