LINUX.ORG.RU

«Простой» синтаксис

 ,


0

1

Небольшая задача. Вот так — не работает:

Ext_Ajax_promise = async function(options) {
    return new Promise(function(resolve, reject) {
        options.callback = function(options, success, response) {
            let result = {
                response: response,
                options: options
            }
            (success ? resolve : reject)(result);
        }
        Ext.Ajax.request(options);
    });
}

Кто за 2 секунды понял, почему, — тот молодец и гуру джаваскрипта. А я не молодец, я ломал голову минут 10.

Если кто-то не догадался, где ошибка, то смотрите историю правок поста — там скрыта рабочая версия.

Мораль простая: не слушайте адептов «простого синтаксиса» и всегда шарашьте точки с запятой.

Задавайте ваши ответы.

★★

Последнее исправление: wandrien (всего исправлений: 1)

Ответ на: комментарий от deep-purple

Стрелочки и асинки прекрасно могут быть протранслированы что Babel’ем, что Typescript’ом хоть в ES5, хоть в ES3, хоть в ES-Prehistoric-Dinosaurs, так что твои потуги с варами и калбяками не имеют ни малейшего смысла. Единственное, что ты по факту получаешь это лапша из нечитабельных callbacks, которые в большинстве случаев будут содержать ошибки при обработке exceptions в одном из этих самых калбеков. Никаких преимуществ в ручном использовании callbacks нет, т.к. ты тупо делаешь руками то, TS/Babel делает автоматом и делает гораздо лучше тебя.

runtime ★★★★
()
Ответ на: комментарий от deep-purple

Ты не напишешь код быстрее и каественнее в своем легаси моде, просто потому что к твоему коду не будут применяться те же оптимизации, что к современному, понял, конч?

anonymous
()
Ответ на: комментарий от wandrien

есть буфер, наполняемый при чтении сокета, сколько туда прочтется — не известно, в данных, среди мусора, для каждой позиции в буфере, надо искать валидные синкворды, а затем, узнав где начало нужного куска, узнать его размер, записаный в этом заголовке и вычитать данные нужного размера к себе в структурку, не забывай — в буфере может быть не достаточно данных... повторять до посинения собирая цепочку структурок.

кстати, в итоге я переписал это на один цикл + гото вверх, т.е. гото осталось.

deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

кстати, в итоге я переписал это на один цикл + гото вверх, т.е. гото осталось.

Потому что ты говнокодер не смог написать машину состояний.

anonymous
()
Ответ на: комментарий от deep-purple

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

Я как раз могу это сделать. А ещё я могу из буханки хлеба сделать троллейбус. И гвозди микроскопом тоже забивать можно. Только зачем?

Но ты давай, продолжай тратить своё время и делать руками то, что у всех нормальных людей делает машина. Дедовские методы - они ж надёжные, да.

runtime ★★★★
()
Ответ на: комментарий от deep-purple

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

Ого, как здорово! По такому случаю, можешь научить как писать ES5 код, чтобы на каждую функцию, у тебя не создавалось по три лишних объекта в памяти (которые не создаются у стрелочных функций и функций-методов es6). И еще поделись пожалуйста, как ты используешь очередь микротасок в легаси-коде (которой там нет), чтобы добиваться эффективной отзывчивости?

javascript
()

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

anonymous
()

анон заходит в тред.

- оу, тут какая то тусовка вебомакак, обсуждающих говняный синтаксис жисы.

анон выходит из треда.

anonymous
()
Ответ на: комментарий от wandrien

Ага, и пробросить половину контекста, и лишиться мутабельности какого-нибудь аккумулятора, и передавать его по указателю. А все потому, что глубинное убеждение, полученное в детстве из чьего-то высера в интернетах, не дает просто взять и гоуту куда надо.

Эти ваши «так нельзя» и «так не стоит» говорят о магическом мышлении куда чаще, чем о какой-то инженерной мудрости. «Так лучше не надо», «вот это лучше». Начинаешь копать а почему – тут же глухая оборона уровня «сам поймешь когда узнаешь», хотя у тебя опыта минимум в 3-5 раз больше, чем у того сектанта. (Я не про тебя конкретно, а в целом, если что).

anonymous
()
Ответ на: комментарий от anonymous

Вары и калбяки тащемта быстрее летконстов и промисов. Первое судя по тестам, второе просто по факту лишней структурки. Не то что бы это играло большую роль или авайты со стрелочками не были удобнее, но ты похоже сектант из церкви «новое лутше».

anonymous
()
Ответ на: комментарий от javascript

очередь микротасок

Че это такое, нука?

anonymous
()
Ответ на: комментарий от anonymous

Ага, и пробросить половину контекста

Пробрасывать надо ровно столько, сколько надо. Если у вас запредельное количество аргументов функции, там весь код с самого начала был написан лапшой. А были в нём goto или нет - уже несущественно.

и лишиться мутабельности какого-нибудь аккумулятора, и передавать его по указателю.

И хер с ними. Всё равно static компилятор инлайнит обратно. А если даже не инлайнит, всё равно хер с ними.

А все потому, что глубинное убеждение, полученное в детстве из чьего-то высера в интернетах, не дает просто взять и гоуту куда надо.

Да пишите как хотите, хоть задом наперёд. Если недостаёт опыта увидеть, как вся программа складывается как здание из типовых кирпичиков, и что конструкция получается модульной, ясной и в то же время прочной.

А конструкции наподобие:

label:
while (1) {
    ...
    ...
    while (1) {
    ...
    ...
        goto label;
    ...
    ...
        goto label;
    ...
    ...
    }
    ...
    ...
}

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

А в прикладном коде goto обычно плодят, когда потребовалось «выйти через два цикла наверх» просто потому, что нет опыта понять, как этот же код пишется в 2 раза понятнее и в одном цикле.

wandrien ★★
() автор топика
Последнее исправление: wandrien (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Не помню по какому линтеру, но есть стандарт, по которому нельзя ставить точки с запятыми. А вот по airbnb наоборот, даже, запятую обязательно нужно ставить на последнем елементе массива.

EmgrtE ★★★★
()
Ответ на: комментарий от wandrien

Сейчас это по сути стандарт. Кажется, можно в IDE задать автоматический подбор в зависимости от языка, но я забил на это.

EmgrtE ★★★★
()
Ответ на: комментарий от Vit

Полностью согласен. Открываешь легаси и сразу видишь на чем споткнулись предыдущие разработчики.

EmgrtE ★★★★
()
Ответ на: комментарий от crutch_master

По-моему ты нагнал. В изначальном варианте линтер вываливает кучу варнингов про неправильное форматирование параметров функции и использование result до объявления.

После замены на if все норм.

Короче, это проблемы очередного понаехавшего, а не точки с запятой. Человек не в курсе, как пишут на жыэсе, но при этом готов учить всех как надо делать. Бывает.

Vit ★★★★★
()
Ответ на: комментарий от wandrien

Завязывай с фантазиями. В треде ни строчки кода нет, а ты из пальца высосал его говеность, возможность развернуть в один луп и недостаток опыта на несуществующем примере. Это сектантство, прислушайся к себе, у тебя аргументы не против гоуту и конкретных последствий, а против мнимого говеного кода, который его обязательно (а как же еще) окружает. Я ведь даже не спорил, что твой способ никогда не нужен, или что нужно валить код стеной и скакать как лошадь. Ты просто антигоуту, вот и вся агенда. Тебя даже в признанном тобой случае будет подмывать переделать без гоуту, потому что «так лутше» засело в подсознании. Вытащи это оттуда, и полегчает. Давай со мной: вдооох что будет если я воткну гоуту? выыыыдох пауза вдооох да ничего выыыдох. Можно выдох делать подольше, увеличивать со временем.

anonymous
()
Ответ на: комментарий от anonymous

Бред. Сам себя послушай: тебе говорят про опыт, а ты в ответ растекаешься соплями.

У тебя есть факты, что «меня будет подмывать»? Нету. Так что это чисто бредни.

Тебе что, когда-то молодому и неопытному дали по рукам на ревью, и у тебя засела травма? Или что произошло? Так ведь дали не за goto, а за говнокод. Если б ты написал говнокод без goto, всё равно бы это был говнокод.

wandrien ★★
() автор топика
Ответ на: комментарий от wandrien

корвалол.

упд:

типовых кирпичиков

кирпичиков которые отложил типОк?

deep-purple ★★★★★
()
Последнее исправление: deep-purple (всего исправлений: 1)
Ответ на: комментарий от EmgrtE

т.к. у нас есть reject, который уже ошибка.

ну async () => { throw new Error('wtf'); } vs () => Promise.reject(new Error('wtf'));

10 отличий найди.

throw какого-то говна возможен, но выглядит странно, следовательно reject’тить тоже надо instanceof Error.

drsm ★★
()
Ответ на: комментарий от wandrien

А какой у тебя опыт, в обоих смыслах, и колво лет в сишке, и опыт с гоуту, который тебя подколол или привел к каким-то проблемам?

У меня вот примерно 20 и 0. Давай сравним.

anonymous
()

Кстати по сабжу-то забыл вчера написать. Для таких случаев есть void.

anonymous
()
Ответ на: комментарий от drsm

Не, не, прикол промиса с его resolve и reject такой же, как и try с catch. То есть, нам не нужно в сам промис пихать объект ошибки, а обрабатывать снаружи:

promise
  .then(() => console.log('sucess'))
  .catch(() => console.log('error'));

На консоли не обращай внимания, это просто для примера.

EmgrtE ★★★★
()
Ответ на: комментарий от EmgrtE

Думаю он говорил о том, что не надо в качестве ошибки кидать/режектить не-instanceof Error, чтобы потом не гадать, что же прилетело, и брать ли у этого .message или еще что. Представь что в try {} ты вызываешь код, который может вызвать axios, а может кинуть «фыва» или {…} или 42. Теперь в catch (error) {} тебе придется чекать что error instanceof Error прежде чем чекать error.response или error.request. Throw вообще не должен бы не-ошибки принимать, но так уж вышло, что может.

anonymous
()

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

Починил.

Nervous ★★★★★
()
Ответ на: комментарий от EmgrtE

но есть стандарт, по которому нельзя ставить точки с запятыми

Выше была на него ссылка - это стандарт говна.
https://standardjs.com/rules.html#semicolons

window.alert('hi');  // ✗ avoid
;[1, 2, 3].forEach(bar) // ✓ ok
Я на рожи им ссал за такие «стандарты».

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Угу, я привык что ты ерунды не пишешь, занервничал, полез проверять. Оказалось, в мире все по-прежнему - кто не юзает с жыэсом линтер, огребает тупых проблем вёдрами.

Vit ★★★★★
()
Ответ на: комментарий от Vit

standardx возьми, да повырубай что тебе не нравится.

Да понятно, что я могу взять, да повырубать. Бесит наглость, типа мы так решили, застолбили домен, имя на npm, теперь все пишите вот так, так правильно. Притом, что многое другое вполне логично и осмысленно.

crutch_master ★★★★★
()
Последнее исправление: crutch_master (всего исправлений: 1)
Ответ на: комментарий от crutch_master

Бывает проще делегировать кому-то право крутить настройки, чтобы не заморачиваться и не отвлекаться от основных задач. Чего бурлить-то? Без точки с запятой прикольно :)

Vit ★★★★★
()
Ответ на: комментарий от deep-purple

«классическая» задача прокачки данных через буфер - обычно через сопрограммы (ну да если в языке нет сопрограмм через гото) -

ща в JS есть сопрограммы ( например итераторы) -

ваще интресней скелет того цикла и гоутой обозреть - может там достаточно continue|break metka? либо (что хуже) обернуть в IIFE с ретурном на месте гоуту(но это та ещё умогимнастика)

крч любопытно увидеть код с гоуту - в малом гоуту норм

прикол с гоуто консидерет хармфул не столько против символа «гоуто» сколько против нагромождений конструкций делающих не видным как разворачивается процесс во времени.

реально не все могут в косвенность - в результате вместо крайне умеренного использование нетривальных гоуту устроили охоту на ведьм.

qulinxao3
()
Последнее исправление: qulinxao3 (всего исправлений: 1)
Ответ на: комментарий от qulinxao3
void
foo(self, new_data /* на каждый вызов будут новые данные */ )
{
    // предыдущие вызовы могли завершится с ошибкой
    if (self->state == ERROR) {
        return;
    }

    /*
        тут реаллок внутреннего буфера
        если добавление новых данных в его конец
        не влезают в имеющийся размер
        и добавление новых данных в конец буфера
    */

    try_more:

    if (self->state == FOUND) {

        /*
            даже если начало пакета найдено
            и его размер известен из заголовка пакета
            данных в буфере на позиции начала пакета
            может быть не достаточно
        */

        if ( /* не достаточно данных в буфере */ ) {
            return;
        }

        /*
            копируем данные из буфера в отдельный новый пакет
            и вставляем его в конец цепочки готовых пакетов,
            двигаем оставшиеся данные из конца буфера в его начало
        */

        self->state = SEARCH;

        /*
            может быть достаточно данных в буфере
            для того чтобы найти там ещё N пакетов
        */

        goto try_more;

    // SEARCH
    } else {
        for ( /* для каждой доступной позиции в буфере */ ) {

            if ( /* в этой позиции нет пакета */ ) {
                continue;
            }

            // пакет нашёлся
            self->state = FOUND;

            // попробуем добавить его в цепочку готовых
            goto try_more;
        }
    }
}
deep-purple ★★★★★
()
Ответ на: комментарий от deep-purple

ЭЭЭЭ? : обычно цикл с входом в середину через switch:


void
foo(self, new_data /* на каждый вызов будут новые данные */ )
{
    // предыдущие вызовы могли завершится с ошибкой
    if (self->state == ERROR) {
        self->state = ERROR;return;                        //!!! for symmetry :)
    }

    /*
        тут реаллок внутреннего буфера
        если добавление новых данных в его конец
        не влезают в имеющийся размер
        и добавление новых данных в конец буфера
    */

    switch(self->state){

    case FOUND: try_more: 

        /*
            даже если начало пакета найдено
            и его размер известен из заголовка пакета
            данных в буфере на позиции начала пакета
            может быть не достаточно
        */

        if ( /* не достаточно данных в буфере */ ) {
            self->state = FOUND;return;                     //!!! need set if from first SEARCH
        }

        /*
            копируем данные из буфера в отдельный новый пакет
            и вставляем его в конец цепочки готовых пакетов,
            двигаем оставшиеся данные из конца буфера в его начало
        */

        //self->state = SEARCH;                             //!!! not needed bytechanging

        /*
            может быть достаточно данных в буфере
            для того чтобы найти там ещё N пакетов
        */

        //goto try_more;                                    //!!! fallthrough  

    // SEARCH
    default: case SEARCH:   // else {
        for ( /* для каждой доступной позиции в буфере */ ) {

            if ( /* в этой позиции нет пакета */ ) {
                continue;
            }

            // пакет нашёлся
            //self->state = FOUND;                          //!!! not needed bytechanging

            // попробуем добавить его в цепочку готовых
    goto try_more;
        }
    }
    self->state = SEARCH;return;}                                 //!!! fallthrough from any FOUND|SEARCH ...

qulinxao3
()
Ответ на: комментарий от wandrien

А конструкции наподобие:

…должны быть заменены на отдельные функции. Для захвата локальных переменных придумали лямбды.

X512 ★★★★★
()
Ответ на: комментарий от deep-purple

Экономия Имён. вход в середину цикла:

void
foo(self, new_data /* на каждый вызов будут новые данные */ )
{
    // предыдущие вызовы могли завершится с ошибкой
    if (self->state == ERROR) {
        self->state == ERROR;return;                        //!!! for symmetry :)
    }

    /*
        тут реаллок внутреннего буфера
        если добавление новых данных в его конец
        не влезают в имеющийся размер
        и добавление новых данных в конец буфера
    */

    switch(self->state){//   try_more:

    default: case FOUND://    if (self->state == FOUND) {

        /*
            даже если начало пакета найдено
            и его размер известен из заголовка пакета
            данных в буфере на позиции начала пакета
            может быть не достаточно
        */

        if ( /* не достаточно данных в буфере */ ) {
            self->state = FOUND;return;                     //!!! need set if from first SEARCH
        }

        /*
            копируем данные из буфера в отдельный новый пакет
            и вставляем его в конец цепочки готовых пакетов,
            двигаем оставшиеся данные из конца буфера в его начало
        */

        //self->state = SEARCH;                             //!!! not needed bytechanging

        /*
            может быть достаточно данных в буфере
            для того чтобы найти там ещё N пакетов
        */

        //goto try_more;                                    //!!! fallthrough  

    // SEARCH
    case SEARCH:   // else {
        for ( /* для каждой доступной позиции в буфере */ ) {

            if ( /* в этой позиции нет пакета */ ) {
                continue;
            }

            // пакет нашёлся
            //self->state = FOUND;                          //!!! not needed bytechanging

            // попробуем добавить его в цепочку готовых
    goto default;
        }
    }
    self->state = SEARCH;return;}                                 //!!! fallthrough after first FOUND 
qulinxao3
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.