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)

А ты умеешь зажечь!
Осоябенно доставляют ваши корявые потуги «Как правильно писать» после этого. GoTo или нет? Линтером по щам с вертушки или захреначим корявый тернарный? Два пробела отступ или точку с запятой ставить-«не надо много шума»?

Молодца, чё. И всё? Всё покатилось по сишным щам с добавками плюсов и раСтишки?

Async придумали, чтобы вот такое говно не писали, но нет! Будем и дальше callback-hell надрачивать. Мы же по другому не умеем. А когда годный коммент рекомендуэ TS, фыркаем, что негоже боярам микроскопом гвозди забивать.

Всем спасибо за веселье.

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

картинка про пчелу и муху

какое классическое заклинание для прокачки буфера?

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

у Кроукфорда(пророка JSon) фанаберия к утверждённой async ибо в стандарт сунули не честное «async» а стандартный_компроммис дающий почву для трудноустраниммых ошибок

TS хорош там где он хорош.

а гавнякать можно и на валинорском.

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

Дядя, ты дурак? У меня кодовая база огромного сайта из 00-х без всяких асинков. Всё на коллбеках. Я ее переписываю нормально теми местами, где есть возможность. Иди возьми ExtJS 4 и покажи мне там промисы, раз такой умный.

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

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

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

Зачем там свич если можно без него?

self->state = ERROR;return; //!!! for symmetry :)

Неужели рантайм с первого раза не понимает?

self->state = FOUND;return; //!!! need set if from first SEARCH

У тебя уже данные для анализа есть, а ты работать не хочешь.

self->state = SEARCH;return; //!!! fallthrough from any FOUND|SEARCH ...

Ты уже начало пакета нашел, но работать не хочешь?

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

вы чего???

для ерора присвоения чисто поржать

а остальные нужны именно потому что

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

вслучае изначального поиска - если нашли начало пакета ушли по гоуту в дефолт - обнаружили его неполноту - вышли(с флагом что оно файнд)

вы внимательней посмотрите что закоментированно - для простоты сличения можно и дифф на вашем и этом сырце - там изменения в пределах строк.

и так(2 варинт) 0прозрачней - так как обратный goto по сути do while цикл, а switch - определяет как мы входим в цикл - «в какую из сопрограмм» - которое в дальнейшем выполняются строго последовательно.

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

т.е поменять местами условие и метку

если же соусем упрощать


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

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

    if (self->state == FOUND) {

    default:

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

        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 ★☆
()
Ответ на: т.е поменять местами условие и метку от qulinxao3

continue refining:

крч классический цикл с входом в середину deep-purple


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

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

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

            if ( /* в этой позиции ЕСТЬ пакета */ ) {       //!!! inversion

    case FOUND:
                // пакет нашёлся
                //self->state = FOUND;                      //!!! not needed bytechanging
                // попробуем добавить его в цепочку готовых
                /*
                даже если начало пакета найдено
                и его размер известен из заголовка пакета
                данных в буфере на позиции начала пакета
                может быть не достаточно
                */

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

                /*
                    копируем данные из буфера в отдельный новый пакет
                    и вставляем его в конец цепочки готовых пакетов,
                    двигаем оставшиеся данные из конца буфера в его начало
                */
                                                            //!!! Если буфер кольцевой то двигать излишне
                                                            //!!!   так же:цикл тогда заменется с for(0,<length) на cur=start;do{    }while(start!=(cur=next(cur))) //!!!
                                                            //!!!   где next(cur) is: (cur+1)%length 
                                                            //!!!   так же: goto default;  вытесняется do-while'ом   
            //self->state = SEARCH;                         //!!! not needed bytechanging

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

            //goto try_more;                                //!!! fallthrough  
    goto default;                                           //!!! RESTART SEARCH    
            }
        }
}
    
    self->state = SEARCH;return;}                           //!!! maybe fallthrough after first FOUND 

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

Wun is quarter

(success ? resolve : reject)(result);

or

if (success) resolve(result) else reject(result)
or
success ? resolve(result) : reject(result)

вам так понятней? :


[reject, resolve][+success] (result)
qulinxao3 ★☆
()
Ответ на: комментарий от deep-purple

Зачем там свич если можно без него?

можно и на машкоде шарашит.

свитч для входа в «середину» цикла -

можно полностью избавиться от гоуту(но не от метки для свитча в середину:) ) без какого либо переусложнения

вся конструкция это switch + do_while (всё ещё не полностью пробежали по кольцевому буферу)

qulinxao3 ★☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.